letrec的常见用法,名为let和internal定义?

时间:2010-09-17 15:39:45

标签: scheme

我有几本关于Scheme的书,其中一些提到了let和letrec,但实际上没有一个会给出一个令人信服的例子(我的意思是,何时以及为什么我会使用一个而不是另一个)。 是否存在letrec / named let实际上比内部定义或外部辅助过程更好的替代方案的例子?

2 个答案:

答案 0 :(得分: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会很有用。

答案 1 :(得分:0)

您可以找到关于这些表单之间差异的最佳解释是this