我正在使用 Racket 宏扩展syntax-id-rules
,它是其他一些方案实现在名称下提供的identifier-syntax
。这些使您可以指定即使定义的标识符不在头部位置也会发生的宏扩展。例如:
(define hidden #f)
(define-syntax proxy
(syntax-id-rules (set!)
[(set! proxy v) (set! hidden v)]
[proxy hidden]))
将标识符设置proxy
为hidden
. 这是一个无用的示例,但它说明了用法。
我发现自己处于想要一个全局普通宏的情况,我们称之为foo
,在某些情况下我想覆盖我使用标识符宏之类的proxy
. 也就是说,我希望能够做这样的事情:
(define-syntax foo
(syntax-rules ()
[(foo arg ...) 'default]))
(define hidden #f)
(define-syntax proxy
(syntax-id-rules (foo set!)
[(foo proxy arg ...) 'special]
[(set! proxy v) (set! hidden v)]
[proxy hidden]))
(foo proxy) ; should return 'special
但实际上最后一行返回'default
,因为foo
宏在它之前被扩展proxy
。
任何想法我可以如何实现这些方面的东西,但proxy
标识符宏覆盖默认宏定义foo
?我并没有专门致力于上述架构。
补充:这不适用于任何现实世界的使用,而是形式语义理论点演示的一部分。