Scheme语法规则 - (let)和(define)之间的变量绑定的差异

时间:2011-11-03 17:13:56

标签: macros scheme hygiene

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-matchvar,因为在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)

,结果仍然是{{1}}

有没有人对这里发生的事情有任何见解?每个R 5 RS会发生什么?

1 个答案:

答案 0 :(得分:4)

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