朝
昨日の夜ベッドに入ったときにぼんやりしていると,関数適用のパースの実装が突然降ってきた(ラマヌジャンかな?)ので,朝起きて実装した.まだ終わっていない.
昼
関数定義と関数適用が通った!きもちえー
ガハハハ pic.twitter.com/uzy4OV4Afl
— いかなごニウム🦀 (@ikanag0) May 24, 2020
これは関数というかクロージャで,束縛されたときの環境(束縛変数と値の組)を内部に持っている.つまりスコープ外からでも,そのクロージャが定義されるときに見えている変数にアクセスできる.
let f = let x = 2 in let g = fun y -> x + y in g in f 4;;
たとえばこのページにあるような上記のコードの場合,f
を呼び出す時点ではx
はスコープ外にあるはずだがこのコードはちゃんと6
を返す.それはg
を束縛するときにそのときの環境を一緒に持たせているからだ.すごい.
夜
多変数関数は一変数関数をネストしたものとして定義しているが,記法上はそれを隠蔽したい(というかOCamlはそう書けるようになっている).というわけでそうした.
うんうん pic.twitter.com/0FJY3Z6vkz
— いかなごニウム🦀 (@ikanag0) May 24, 2020
これで一気にOCamlっぽくなった気がする.しかもSKIコンビネータが書けるのでチューリング完全になった.はや.
次は再帰関数を実装する.