私は、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
しかし実際には、マクロが 1 つ前に展開される'defaultため、最後の行は を返します。fooproxy
これらの行に沿って何かを達成する方法はありますが、proxy識別子マクロがデフォルトのマクロ定義をオーバーライドしますfooか? 私は特に上記のアーキテクチャに専念しているわけではありません。
追加: これは実際に使用するためのものではありませんが、正式なセマンティクスの理論的ポイントのデモンストレーションの一部です。