204
6
章 無からのプログラミング
数
inc
と
zero
で式を呼び出して
†
、実際に何が起こるか見てみましょう。
>>
inc, zero = LCVariable.new(:inc), LCVariable.new(:zero)
=> [inc, zero]
>>
expression = LCCall.new(LCCall.new(expression, inc), zero)
=> -> p { -> x { p[-> p { -> x { p[x] } }[p][x]] } }[inc][zero]
>>
while expression.reducible?
puts expression
expression = expression.reduce
end; puts expression
-> p { -> x { p[-> p { -> x { p[x] } }[p][x]] } }[inc][zero]
-> x { inc[-> p { -> x { p[x] } }[inc][x]] }[zero]
inc[-> p { -> x { p[x] } }[inc][zero]]
inc[-> x { inc[x] }[zero]]
inc[inc[zero]]
=> nil
これはまさに、数2に期待していた振る舞いです。期待していた式とは少し違うかもしれませんが、
結局のところ、
-> p { -> x { p[-> p { -> x { p[x] } }[p][x]] } }
は正しい結