Grassでクロージャ
折角だからGrassでクロージャのチュートリアルを書いてみよう。
ソースコメント中のcharはプリミティブのwと思ってください。
; stack bottom
; in
; char
; succ
; out
wwWWwWWWwv ; チャーチ数の<2> (λf x . f (f x))を定義
Www ; <2>(スタックのtop)にout(スタックtopから2番目)を渡す
; -> クロージャ (λx . out (out x)) ができた
Wwwwww ; クロージャにプリミティブのcharを渡したり
WWWWWWWw ; inを使って標準入力から1文字読み込んで
WWWw ; ↑の結果をクロージャに渡すtest.wwwとして保存して実行
$ ruby grass.rb test.www ww
( (λx . out (out x) ) w)が実行されてwが2文字出力された後、(in w)が実行されて入力待ちに。
vと入力してリターン
$ ruby grass.rb test.www wwv vv $
( (λx . out (out x) ) v)が実行されてvが2文字出力されて終了。
こんな感じ。