Zor*_*orf 5 macros scheme define-syntax
R5RS为库语法形式提供了建议的宏定义:
http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-ZH-10.html#%_sec_7.3
其中也以一种非常复杂的方式定义了letrec,当然不是我如何定义它,我会简单地使用:
(define-syntax letrec2
(syntax-rules ()
((letrec2 ((name val) ...) body bodies ...)
((lambda ()
(define name val) ...
body bodies ...)))))
Run Code Online (Sandbox Code Playgroud)
据我所知,letrec的语义,我经常使用它作为命名let.它的工作原理这样,但是我有我与谁认为他们可以否定了狭义相对论或建立语音理论哲学家争论的公平份额,我知道,当你认为你有一个简单的解决一个复杂的问题,它可能错误.必须要有一点,这个宏不能满足letrec的语义,否则他们可能已经使用过了.
在这个定义中,定义是letrec主体的局部定义,它们可以相互引用相互递归,我不太确定是什么(如果有的话)是错误的.
在我看来,你已经将实现的责任从宏扩展到R5RS设计者似乎试图避免的编译器.
事实上,本地定义是在R5RS中使用letrec实现的.见6.2.2内部定义.
编程语言的设计不应该通过功能顶部的打桩功能来设计,而是通过消除使得其他功能显得必要的弱点和限制.Scheme表明,用于形成表达式的极少数规则,对它们的组成方式没有限制,足以形成一种实用且高效的编程语言,该语言足够灵活,可支持当今使用的大多数主要编程范例.
edit1:内部定义的示例转换为let5的r5rs版本.PLT方案4.2.5收集/ r5rs/main.ss
(define-syntax (r5rs:body stx)
(syntax-case stx (let)
[(_ (let () . body))
#'(let () . body)]
[_
;; Convert internal definitions to `r5rs:letrec', as opposed
;; to `letrec'.
...
Run Code Online (Sandbox Code Playgroud)
在R5RS模式下的PLT方案中,确实将内部定义转换为letrec的R5RS版本.您还可以在具有内部定义的任何代码上使用DrScheme的宏扩展器来自行测试.
好吧,我终于找到原因了,就这么简单,没用,我的定义没有任何问题,实际上是由于一些优于R5RS的错误造成的。
http://community.schemewiki.org/?scheme-faq-macros
寻找“letrec”,你们都无法回答我关于出了什么问题的问题,显然没有任何问题,R5RS 显然在信息部分有一个“勘误表”。我想我现在将被迫接受自己的答案......
现在引出的问题是,为什么 R5RS 作者没有选择这个简单的解决方案,而是选择了一个非常复杂的解决方案,甚至包含一个错误......