gpt4 book ai didi

scheme - 在 Scheme 中 (let ((cdr cdr)) 的目的

转载 作者:行者123 更新时间:2023-12-03 21:15:15 25 4
gpt4 key购买 nike

我最近一直在研究 Scheme 并遇到了一个按以下方式定义的函数:

(define remove! 
(let ((null? null?)
(cdr cdr)
(eq? eq?))
(lambda ... function that uses null?, cdr, eq? ...)

绑定(bind)null的目的是什么?为空?或 cdr 到 cdr,当这些内置函数在没有 let block 的函数定义中可用时?

最佳答案

在普通的 R5RS 方案中,没有模块系统——只有顶层。此外,心态是一切都可以修改,所以你可以“定制”任何你想要的语言。但是如果没有模块系统,这将无法正常工作。例如,我写

(define (sub1 x) (- x 1))

在您加载的库中 -- 现在您可以重新定义 - :
(define - +) ; either this
(set! - +) ; or this

现在你无意中破坏了我依赖 sub1 的库将其输入减一,因此当您将它们向下拖动时,您的窗口会上升,或者其他什么。

几个库使用的唯一方法是在有人修改之前“获取”减法函数的相关定义:
(define sub1 (let ((- -)) (lambda (x) (- x 1))))

现在事情会“更顺利”,因为你不能修改我的 sub1 的意思。通过更改 - 来发挥作用. (除了...如果您在加载我的库之前对其进行修改...)

无论如何,作为这个结果(如果你知道 - 是加载库时的原始值),一些编译器会检测到这一点并看到 - call 始终是实际的减法函数,因此它们将内联调用它(并且内联对 - 的调用最终会导致汇编代码用于减去两个数字,因此这是一个很大的速度提升)。但就像我在上面的评论中所说的,这与上面的实际原因更为巧合。

最后,R6RS(和之前的几个方案实现)修复了这个问题并添加了一个库系统,所以这个技巧没有用: sub1只要其库中的其他代码没有重新定义 -,代码就是安全的在某种程度上,编译器可以基于此安全地优化代码。不需要聪明的技巧。

关于scheme - 在 Scheme 中 (let ((cdr cdr)) 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213638/

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