2010-09-17 44 views
4

我有几本关于Scheme的书,其中一些提到了let和letrec,但没有一个会给出一个令人信服的例子(我的意思是,什么时候以及为什么要用另一个)。 有没有letrec/named let比内部定义或甚至外部辅助程序更好的选择?letrec的常见用法,名为let和internal定义?

回答

7

你使用哪一个主要是风格问题。

我经常没有发现自己使用letrec,只是更喜欢内部定义。我经常使用named let来编写尾递归循环,类似于这个无意义的循环。

(let loop ((var init) (other-var other-init)) 
    (cond 
    ((done? var) var) 
    ((finished? other-var) other-var) 
    (else (loop (modify var) (manipulate other-var))))) 

你可以做一个letrec或内部定义是相同的,但我觉得这是一个最简单的阅读。

letrec在宏扩展到您不想创建的地方定义时很有用。

0

也许你可以找到这些形式之间的区别最好的解释是this