Scheme 为什么可以';这个宏不能执行吗?
我有以下愚蠢的测试:Scheme 为什么可以';这个宏不能执行吗?,scheme,racket,Scheme,Racket,我有以下愚蠢的测试: (define-syntax a (lambda (stx) (syntax-case stx () [(k e s) #'(let ((show display)) (e s))]))) (a show "something") 为什么这个不行?(DrRacket中显示的错误是:show中的模块中的扩展:未绑定标识符 但是,以下方法可以起作用: (define-syntax a (lambda (stx) (syntax-case stx ()
(define-syntax a
(lambda (stx)
(syntax-case stx ()
[(k e s) #'(let ((show display)) (e s))])))
(a show "something")
为什么这个不行?(DrRacket中显示的错误是:show中的模块中的扩展:未绑定标识符
但是,以下方法可以起作用:
(define-syntax a
(lambda (stx)
(syntax-case stx ()
[(k e s)
(with-syntax ((show (datum->syntax #'k 'show)))
#'(let ((show display)) (e s)))])))
(a show "something")
那么为什么呢?嗯,我假设您是在阅读了我在一篇文章中提到的内容之后尝试这一点的,但那篇博文正是在解释这个问题。具体地说,您的第一个示例有两个不同的
show
标识符,一个是由宏绑定的,另一个是来自顶层使用的(并且是未绑定的).OTOH,在第二种情况下,您正在使用用户代码的词法上下文创建一个show