R 5 RS规范指出,作为使用syntax-rules
定义的宏的要求的一部分:
如果宏转换器插入对标识符的空闲引用,则引用引用在指定转换器的位置可见的绑定,而不管可能围绕宏的使用的任何本地绑定。
我试图了解这在实践中是如何运作的。例如,如果我有以下代码:
(define var 'original)
(define-syntax test-var
(syntax-rules (var)
((_ var)
var)
((_ pattern-var)
'no-match)))
我希望以下内容(如果立即执行)评估为original
,它会:
(test-var var)
我希望这个no-match
为var
,因为在test-var
之前引入范围的var
与宏定义中(let ((var 1)) (test-var var))
的绑定不匹配:
(define var 'new-var)
(test-var var)
然而下面的例子令我困惑:
new-var
在Chicken Scheme中,评估结果为no-match
。出于与前一个(let)
示例相同的原因,我原以为define
。我认为这可能是使用new-var
两次的问题,但即使我使用(set! var 'new-var)
有没有人对这里发生的事情有任何见解?每个R 5 RS会发生什么?
答案 0 :(得分:4)
这是Schemes在处理REPL上的重新定义时常用的技巧 - 将它们视为现有绑定的变异。所以第二个define
并没有真正创建一个新的绑定,而只是set!
现有的绑定。