在尝试使用球拍的宏时,我偶然发现了一个起初对我来说并不明显的定义,为什么它被拒绝了。代码很短,否则可能没用,但如下:
#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)
那么它可以工作。我有一种预感,'
即。即使在语法上它是相同的字母序列,在子模块 mod 中也不会被识别为相同的quote
绑定(go 'dummy)
。#lang racket
如果我通过往返来去除所有词汇上下文的虚拟,如下所示:
(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
没有这个样板真的一样吗?