我有几本关于Scheme的书,其中一些提到名为let和letrec,但实际上没有一个会给出一个令人信服的例子(我的意思是,何时以及为什么我会使用一个而不是另一个) . 是否存在letrec / named let实际上比内部定义或外部辅助过程更好的替代方案?
你使用哪一个主要是风格问题 .
我不经常使用 letrec ,只是更喜欢内部定义 . 我经常使用named let来编写尾递归循环,类似于这个无意义的循环 .
letrec
(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 会很有用 .
您可以找到关于这些形式之间差异的最佳解释是this .
2 回答
你使用哪一个主要是风格问题 .
我不经常使用
letrec
,只是更喜欢内部定义 . 我经常使用named let来编写尾递归循环,类似于这个无意义的循环 .您可以使用
letrec
或内部定义执行相同操作,但我发现这个最容易阅读 .当宏扩展到您不想创建定义的位置时,
letrec
会很有用 .您可以找到关于这些形式之间差异的最佳解释是this .