我有几本关于Scheme的书,其中一些提到名为let和letrec,但实际上没有一个会给出一个令人信服的例子(我的意思是,何时以及为什么我会使用一个而不是另一个).是否存在letrec/named let实际上比内部定义或外部辅助过程更好的替代方案?
你使用哪一个主要是风格问题.
我不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)))))
Run Code Online (Sandbox Code Playgroud)
您可以使用letrec
或内部定义执行相同操作,但我发现这个最容易阅读.
letrec
在宏扩展到您不想创建定义的位置时非常有用.