gpt4 book ai didi

macros - Scheme 语法规则 - (let) 和 (define) 之间变量绑定(bind)的区别

转载 作者:行者123 更新时间:2023-12-04 00:46:51 25 4
gpt4 key购买 nike

R5RS 规范指出,作为使用 syntax-rules 定义的宏的要求的一部分:

If a macro transformer inserts a free reference to an identifier, the reference refers to the binding that was visible where the transformer was specified, regardless of any local bindings that may surround the use of the macro.

我正在尝试了解这在实践中是如何运作的。例如,如果我有以下代码:

(define var 'original)

(define-syntax test-var
(syntax-rules (var)
((_ var)
var)
((_ pattern-var)
'no-match)))

我希望下面的代码,如果在之后立即执行,将评估为 original,它会这样做:

(test-var var)

而且我希望这个是不匹配,因为在 test-var 之前引入作用域的 var 与在宏定义处绑定(bind) var:

(let ((var 1)) (test-var var))

然而下面的例子让我感到困惑:

(define var 'new-var)
(test-var var)

在 Chicken Scheme 中,它的计算结果为 new-var。出于与前面的 (let) 示例相同的原因,我希望它是 no-match 。我认为这可能是使用 define 两次的问题,但结果仍然是 new-var 即使我使用 (set!var 'new-var )

有人知道这里发生了什么吗?每个 R5RS 应该发生什么?

最佳答案

这是 Schemes 在处理 REPL 上的重新定义时常用的技巧——将它们视为现有绑定(bind)的突变。所以第二个 define 并没有真正创建一个新绑定(bind),而只是 set! 现有绑定(bind)。

关于macros - Scheme 语法规则 - (let) 和 (define) 之间变量绑定(bind)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999084/

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