gpt4 book ai didi

scheme - 如果有的话,Scheme 中 letrec 的这个定义有什么问题?

转载 作者:行者123 更新时间:2023-12-04 17:58:55 25 4
gpt4 key购买 nike

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。它以这种方式工作,但是由于我与认为他们可以反驳狭义相对论或已建立的音系理论的哲学家进行了相当多的辩论,我知道当您认为您对复杂问题有一个简单的解决方案时,它可能是错误的。一定有一些地方这个宏不满足 letrec 的语义,否则他们可能会使用它。

在这个定义中,定义是 letrec 主体的局部定义,它们可以相互引用以进行相互递归,我不太确定什么(如果有的话)是错误的。

最佳答案

在我看来,您已经将实现的责任从宏推到了编译器,这是 R5RS 设计人员似乎试图避免的。

事实上,本地定义是在 R5RS 中使用 letrec 实现的。见 6.2.2 Internal definitions .

我认为设计师的意图在introduction to the R5RS中总结得很好。 :

Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary. Scheme demonstrates that a very small number of rules for forming expressions, with no restrictions on how they are composed, suffice to form a practical and efficient programming language that is flexible enough to support most of the major programming paradigms in use today.



编辑1:
内部定义转换为 r5rs 版本的 letrec 的示例。
PLT 方案 4.2.5 collects/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'.
...

在 R5RS 模式下的 PLT 方案中,确实将内部定义转换为 letrec 的 R5RS 版本。
您也可以通过在任何具有内部定义的代码上使用 DrScheme 的宏扩展器来自己测试。

关于scheme - 如果有的话,Scheme 中 letrec 的这个定义有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2835582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com