作者SansWord (是你)
看板PLT
标题Re: [问题] letrec 为何可以成立? (In scheme, ma …
时间Thu Jun 3 00:44:20 2010
: 另外我们会发现我们是用 host 语言的 let 在定义被解译的语言的 let.
: 那 LETREC 呢?如你所说,我们需要一个递回的环境。递回的环境怎麽产生呢?
: 既然 host 语言有 letrec, 那就用吧:
: eval (LETREC a=e1 IN e2) env =
: letrec env' = (a,v1) : env
: v1 = eval e1 env'
: in eval e2 env'
: e1 要在 env' 这个环境中 eval, 而 env' 之中必须把
: a 指到 e1 求值的结果 v1.
: 这麽做的条件是 host 语言已经有 letrec, 可以用来取递回定义的
: 解。如果没有,「没有 type」的 lambda calculus 也有办法取
: 取递回定义的 fixed-point (例如前面说的 Y combinator).
这段不只是recursive, 而且还是mutural recursive.
(env' 用到v1的定义, v1 用到env'的定义)
使用host语言做有点偷懒啦....:p 刻意给自己的限制就是为了学习怎麽做到这个机制
没有type 是因为这样才能做到 "把自己丢给自己" 吗?
我後来在想,我的方法可以成立还有个重要因素是因为这套语言是weak normal form.
当eval 到 lambda 就会停止不继续eval.
否则我很难想像要怎麽做到以下的let
(let
( ( x ( * 2 y ) )
( y ( / z 3 ) )
( z ( + 1 x ) )
)
( + x y z )
)
不过有这种是否真的有这种需求的let? 这就再说再看看了....XD
--
爱与被爱....都是很毒很毒的
毒药
爱着一个人....只会感受到付出没有回报的悲伤
被一个人爱上....却会因为不能回应而觉得有罪恶感
也许...爱..和被爱..都只有一种解药....那就是....
深深爱上一个深爱你的人
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.217.232