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