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