2011-12-11 51 views

回答

9

我知道,我们通常要求的内容被复制,但没有简短的回答你的问题。 http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf

+2

The Dybvig et al。纸是一个很好的。几年前还有一个很好的[关于Lambda终极版的讨论](http://lambda-the-ultimate.org/node/2971),讲述了如何在lambda方面实现letrec。 (说了这么多,我同意sacundim的评论,“仅仅因为功能特征是在幕后执行命令性代码,并不能使这个功能成为必需的”)。 –

8

号仅仅因为一个功能特征与幕后必要的代码,不会使功能势在必行实现。我们的计算机器都是必不可少的;所以在某些时候,所有的功能代码都必须通过翻译成命令式的代码来实现!

最关键的事情在这里明白的是:函数式编程涉及接口,不实施。一段代码是功能性的,如果是代码本身是无法观察任何副作用,即使副作用实际上发生在幕后。也就是说,如果您检查相同的绑定同一个变量多次的价值,你会得到相同的值,即使这个值,在幕后,是由使用的set!放在那里。

letrec的情况下,这里有一个小难题:如果任何在letrec绑定的评估导致另一个被derefenced结果是不确定的。所以,这个代码的结果是不确定的:

(letrec ((foo bar) 
     (bar 7)) 
    (cons foo bar)) 

foo在letrec主体的价值是不确定的。以下的结果,在另一方面,被定义:

(letrec ((foo (lambda() bar)) 
     (bar 7)) 
    (cons (foo) bar)) 

这是因为评估lambda捕获参考吧,但直到闭合在主体执行的实际值未查找。

相关问题