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文字出力されて終了。
こんな感じ。