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

うーん、Grassの文法とラムダ計算の知識が前提の説明は対象者が狭くなっちゃうな。
そもそもラムダ計算って何? クロージャって何? って人向けのチュートリアルも考えてみよう。
誰か密かにやる夫で学ぶGrassとか書いてないかな。