日記(5/24)

昨日の夜ベッドに入ったときにぼんやりしていると,関数適用のパースの実装が突然降ってきた(ラマヌジャンかな?)ので,朝起きて実装した.まだ終わっていない.

関数定義と関数適用が通った!きもちえー

これは関数というかクロージャで,束縛されたときの環境(束縛変数と値の組)を内部に持っている.つまりスコープ外からでも,そのクロージャが定義されるときに見えている変数にアクセスできる.

let f = 
  let x = 2 in
  let g = fun y -> x + y in
  g
in f 4;;

IoPLMaterials | Materials for the class “Implementation of Programming Languages” in Kyoto University.

たとえばこのページにあるような上記のコードの場合,fを呼び出す時点ではxはスコープ外にあるはずだがこのコードはちゃんと6を返す.それはgを束縛するときにそのときの環境を一緒に持たせているからだ.すごい.

多変数関数は一変数関数をネストしたものとして定義しているが,記法上はそれを隠蔽したい(というかOCamlはそう書けるようになっている).というわけでそうした.

これで一気にOCamlっぽくなった気がする.しかもSKIコンビネータが書けるのでチューリング完全になった.はや.
次は再帰関数を実装する.