为什么这个宏不能执行?

时间:2011-04-10 06:25:12

标签: scheme racket

我有以下愚蠢的测试:

(define-syntax a
 (lambda (stx)
   (syntax-case stx ()
     [(k e s) #'(let ((show display)) (e s))])))
(a show "something")

为什么这不起作用? (DrRacket中显示的错误是expand: unbound identifier in module in: 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")

然后为什么?

1 个答案:

答案 0 :(得分:2)

嗯,我认为你在阅读blog post中提到的earlier answer后尝试了这一点 - 但该博文正好解释了这个问题。具体来说,您的第一个示例有两个不同的show标识符,一个由宏绑定,一个不同的一个来自顶层使用(并且是未绑定的)。 OTOH,在第二种情况下,您正在使用用户代码的词汇上下文创建show