Scheme 自由标识符=?和绑定标识符=?

Scheme 自由标识符=?和绑定标识符=?,scheme,racket,r6rs,Scheme,Racket,R6rs,试图理解自由标识符=?和绑定标识符=?。有谁能给我一些使用免费标识符=?将返回true并使用绑定标识符=?将返回false 谢谢这里有一个例子: (define-syntax (compare-with-x stx) (syntax-case stx () [(_ x-in) (with-syntax ([free=? (free-identifier=? #'x-in #'x)] [bound=? (bound-identifier=

试图理解自由标识符=?和绑定标识符=?。有谁能给我一些使用免费标识符=?将返回true并使用绑定标识符=?将返回false

谢谢这里有一个例子:

(define-syntax (compare-with-x stx)
  (syntax-case stx ()
    [(_ x-in)
     (with-syntax ([free=? (free-identifier=? #'x-in #'x)]
                   [bound=? (bound-identifier=? #'x-in #'x)])
       #'(list free=? bound=?))]))

(define-syntax go
  (syntax-rules ()
    [(go) (compare-with-x x)]))

(go) ;; => '(#t #f)
go
引入的
x
上有一个扩展步骤的标记,但是
compare-with-x
中的
x
没有,因此
绑定标识符=?
认为它们不同

下面是另一个例子:

(define-syntax (compare-xs stx)
  (syntax-case stx ()
    [(_ x1 x2)
     (with-syntax ([free=? (free-identifier=? #'x2 #'x2)]
                   [bound=? (bound-identifier=? #'x1 #'x2)])
       #'(list free=? bound=?))]))

(define-syntax go2
  (syntax-rules ()
    [(go2 x-in) (compare-xs x-in x)]))

(go2 x) ;; => '(#t #f)

这里
go2
还引入了带有标记的
x
,而作为参数提供给
go2
x
没有标记。同样的故事。

相关内容请参见Racket邮件列表和周围的线程。我理解这些函数应该用于什么,我理解为什么它们是以这样的方式定义的(在标记和替换方面)。我难以理解的是,在什么情况下,他们可以给出不同的结果。一个代码示例(即使是毫无意义的)将有助于实现这一点。你最好的办法是在球拍列表上提问。Ryan可能会回答。(他也是如此,但更可能错过这里,我会打他以防万一。)注意
(与x比较)
也有结果
(#t#f)
。因此,第一个示例不需要使用
go
宏。