日記(5/24)
朝
昨日の夜ベッドに入ったときにぼんやりしていると,関数適用のパースの実装が突然降ってきた(ラマヌジャンかな?)ので,朝起きて実装した.まだ終わっていない.
昼
関数定義と関数適用が通った!きもちえー
ガハハハ 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コンビネータが書けるのでチューリング完全になった.はや.
次は再帰関数を実装する.