
208
|
第 6 章
因為這個語言具有這類的最小語法,所以這 3 個類別就足以表示任何 lambda 演算程
式。
語意
現在我們將在每個語法類別實作
#reduce
方法,這可提供小步驟操作語意給 lambda 演
算。小步驟是很有吸引力的選擇,因為它能讓我們看到估算的各個步驟,這是我們無法
在 Ruby 運算式輕易做到的。
替換變數
在我們可以實作
#reduce
之前,需要另一個名為
#replace
的運算,它會找出運算式裡出
現的特定變數,並以某些其他的運算式替換它們:
class LCVariable
def replace(name, replacement)
if self.name == name
replacement
else
self
end
end
end
class LCFunction
def replace(name, replacement)
if parameter == name
self
else
LCFunction.new(parameter, body.replace(name, replacement))
end
end
end
class LCCall
def replace(name, replacement)
LCCall.new(left.replace(name, replacement), right.replace(name, replacement))
end
end
這能在變數和呼叫以明顯的方式運作:
>> expression = LCVariable.new(:x) ...