如何在不使用set!
的情况下实现letrec
?
看起来,set!
是一种命令式编程构造,在使用它时,会失去函数式编程的好处。
如何在不使用set!
的情况下实现letrec
?
看起来,set!
是一种命令式编程构造,在使用它时,会失去函数式编程的好处。
我知道通常我们要求内容被复制,但是对于你的问题并没有简短的答案。 http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf
(说明:本段内容无需翻译,已经是中文)
set!
设置的。letrec
的情况下,这里有一个小陷阱:如果 letrec
中的任何一个绑定的求值导致另一个绑定被取消引用,结果是未定义的。因此,此代码的结果是未定义的:(letrec ((foo bar)
(bar 7))
(cons foo bar))
在letrec的主体中,foo
的值是未定义的。 另一方面,以下结果是已定义的:
(letrec ((foo (lambda () bar))
(bar 7))
(cons (foo) bar))
这是因为评估 lambda
捕获了对 bar 的引用,但实际值直到在主体中执行闭包时才被查找。