Posted on

ルイボスティー

ツイートまとめ定期

関数型言語の実装: Structural Sub-typingの実装

TypeScriptも採用する Structural Sub-typing を実装したいです。 TypeScriptの型メモ #型システム - Qiita

やる気が再燃したので実装を進めていました。

(let f (fn x (fn y (+ x y))))
((f 1) ((f 2) 3))
# (f 1) == (fn y (+ 1 y))
# ((f 2) 3) == 5
# 6
  • レコード型を作り, 型推論・型チェックを作りました #7

github.com/wakame-tech/...

おおー良い感じに型推論と型チェックされるようになった💯

[image or embed]

— か (@w4k4.me) May 16, 2024 at 0:00

  • type alias
  • getter関数 ^. と getter type [] も作りました
    • 型は ^.: (r: t, k: atom) -> ([] t k)
      • 本当は trecord のsubtypeですがgenericsが使えないので表現できません
    • (type t : ([] (record (a : int)) :a)) とか型宣言できてしまうので, 型の評価をしなければなりません
      • 型検査時に ([] (record (a : int)) :a) を評価して int にして t を登録します
# getter type
(type t : (record
    (x : int)
    (y : bool)
))
(let a : t (record
    (x : 1)
    (y : true)
))
(let x2 : ([] t :x) ([] a :x))

# getter
(type t : int)
(type s : (record (a : t)))
(let x : s (record (a : 1)))
(^. x :a)
  • ラムダ式で複数引数取れるようにして、-> を中置するようにしました. commit
    • 元の表記: (-> int (-> int int)))
    • 今の表記: (int int) -> int)
      • 見やすいですね
  • case式を実装しました (条件 => 式) を羅列します, 式の型は全て同じにならないといけません
    • ついでに論理演算子も作りました
(let x 1)
(case
    ((& (== (% x 3) 0) (== (% x 5) 0)) => :fizzbuzz)
    ((== (% x 3) 0) => :fizz)
    ((== (% x 5) 0) => :buzz)
    (true => :other)
)
  • 文字列型とか map とか range 関数も作り, FizzBuzzが書けるようになりました
(let fizzbuzz
    (fn (x : int)
        (case
            ((& (== (% x 3) 0) (== (% x 5) 0)) => 'fizzbuzz')
            ((== (% x 3) 0) => 'fizz')
            ((== (% x 5) 0) => 'buzz')
            (true => (to_string x))
        )
    )
)
(map dbg (map fizzbuzz (range 1 30)))

生活

  • 新大久保のおしゃなレンタルルームでマーダーミステリーをしていました
    • クライナーを差し入れました

200

チームラボ

  • 社の新卒研修中にチームラボに行くイベントがあり, 新卒研修に携わった関係で同行しましたな
    • みんなプロジェクターの話とか制御の話とかLiDARの話をしていて楽しかったです

200

200

  • こういう空間でDJイベントあったら絶対楽しい

娯楽

  • 「JAPAN JAM 2024」
  • 「KING SUPER LIVE 2024 Day1」
  • 学マスはじめました

200