R5RS为库语法形式提供了建议的宏定义:
http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-10.html#%_sec_7.3
其中也以一种非常复杂的方式定义了letrec,当然不是我如何定义它,我会简单地使用:
(define-syntax letrec2
(syntax-rules ()
((letrec2 ((name val) ...) body bodies ...)
((lambda ()
(define name val) ...
body bodies ...)))))
据我所知,letrec的语义,我经常使用它作为命名let . 它以这种方式运作,但是我与哲学家们进行了公平的辩论,他们认为他们可以反驳狭义相对论或已 Build 的语音学理论,我知道当你认为你有一个复杂问题的简单解决方案时,它可能是错误 . 必须要有一点,这个宏不能满足letrec的语义,否则他们可能已经使用过了 .
在这个定义中,定义是letrec主体的局部定义,它们可以相互引用相互递归,我不太确定是什么(如果有的话)是错误的 .
4 回答
在我看来,你已经将实现的责任从宏扩展到R5RS设计者似乎试图避免的编译器 .
事实上,本地定义是在R5RS中使用letrec实现的 . 见6.2.2 Internal definitions .
我认为设计师的意图总结在_2656735中:
edit1:内部定义的示例转换为let5的r5rs版本 . PLT方案4.2.5收集/ r5rs / main.ss
在R5RS模式下的PLT方案中,确实将内部定义转换为letrec的R5RS版本 . 您还可以在具有内部定义的任何代码上使用DrScheme的宏扩展器来自行测试 .
R5RS指出
letrec
的语义与内部定义的语义完全相同 . 有关详细信息,请参阅the section devoted to the latter;我引用下面的关键片段:因此,根据内部定义来定义
letrec
只会改变问题 .此外,我发现定义
letrec
宏并将lambda
desugar内部定义到letrec
比将所有复杂代码填充到lambda
处理程序并构建letrec
更简单 . 这没有涉及哪个是在非顶级范围内引入相互递归绑定的更漂亮的形式的问题...... ;-)好问题 .
我认为
define
序列的问题是这样的:这里:http://www.scheme.com/tspl4/binding.html#./binding:s20
好吧,我终于找到了原因,它就像无用一样简单,我的定义没有任何问题,实际上是由于某些错误优于R5RS .
http://community.schemewiki.org/?scheme-faq-macros
寻找'letrec',你们都无法回答我的错误问题,显然没有错,R5RS显然在信息部分有一个“错误” . 我猜我现在将被迫接受我自己的答案......
现在问题是为什么R5RS作者没有选择这个简单的解决方案,而是选择了一个非常复杂的解决方案甚至包含错误...