Scheme 自由标识符=?和绑定标识符=?
试图理解自由标识符=?和绑定标识符=?。有谁能给我一些使用免费标识符=?将返回true并使用绑定标识符=?将返回false 谢谢这里有一个例子: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=
(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
宏。