【发布时间】:2018-07-15 20:09:59
【问题描述】:
在尝试使用球拍的宏时,我偶然发现了一个定义,起初我并不明白为什么它被拒绝了。代码很短,否则可能没用,但如下:
#lang racket
(define-syntax (go stx)
(syntax-case stx ()
[(_ id)
#'(module mod racket
(define it id))]
))
(go 'dummy)
投诉是quote: unbound identifier; also, no #%app syntax transformer...
如果我手动将(define it id) 内联到(define it 'dummy),那么它可以工作。
我有预感' 即。由#lang racket 绑定的(go 'dummy) 中的quote 在子模块mod 中不被识别为相同的绑定,即使在语法上它是相同的字母序列。如果我通过如下往返来去除所有词汇上下文的虚拟内容:
(with-syntax ([ok (datum->syntax #f (syntax->datum #'id))])
下面的模式匹配 (_ id) 并将 it 的定义替换为 (define it ok) 然后一切都很好。
#lang racket
(define-syntax (go stx)
(syntax-case stx ()
[(_ id)
(with-syntax ([ok (datum->syntax #f (syntax->datum #'id))])
#'(module mod racket
(define it ok)))]
))
(go 'dummy)
我认为我的困境是由卫生系统造成的。但是,是否有更直接的解决方案可以让球拍编译器相信这些标识符,即。 quote 没有这个样板真的一样吗?
【问题讨论】: