Lazy K の IO リスト
Lazy K のプログラムは Input リストを引数にとり、Output リストを出力する関数とみることができます。でもって空の Lazy K プログラムは I として扱われるため (というか何か書くと I の引数として評価されてく) Lazy K での cat は 0 byte になります。(Input をそのまま Output するので I でいい)
Lazy K のリストは Lisp のようにペアのいれこになっていて、一つのペア (X . Y) は (lambda (f) (f X Y))) と表現するらしいです。
Ruby で Lazy K の Input をそのまんま実装すると
def inputlist(l)
lambda {|f|
f[(l.first || 256).to_church_number][inputlist(l[1..-1] || [])]
}
end
il = inputlist([72, 101, 108, 108, 111])
S = lambda {|x, y, z| x[z][y[z]] }.curry
K = lambda {|x, y| x }.curry
I = lambda {|x| x }
car = il[K] #=> チャーチ数 72 (car il)
cdr = il[S[K]] #=> (cdr il)
cdr[K] #=> チャーチ数 101 (car (cdr il))こんな感じになりました。 Lazy K の Input リストは無限リスト (EOF 以降は 256) になっています。