Racket でマクロを定義するために構文トランスフォーマーを使用しています。構文を操作するのに役立つヘルパー関数をいくつか作成したいと考えています。ただし、構文トランスフォーマーの外部で定義した関数は、構文トランスフォーマー内では使用できません。たとえば、次のコードでは
(define (my-function x) (+ x 1))
(define-syntax my-macro
(lambda (stx)
(datum->syntax stx (my-function (cadr (syntax->datum stx))))))
エラー "my-function: reference to an unbound identifier at phase: 1; the Transformer environment" が表示されました。
いくつかの検索の後、次のコードを記述してmy-function
、構文トランスフォーマー内で使用できるようにしました。
(begin-for-syntax
(define (my-function x) (+ x 1)))
(provide (for-syntax my-function))
(define-syntax my-macro
(lambda (stx)
(datum->syntax stx (my-function (cadr (syntax->datum stx))))))
しかし問題は、my-function
今回はシンタックス トランスフォーマー以外では使用できないことです。通常のコードでこれらのヘルパー関数をチェックしたい場合があるため、 function と同様に、構文トランスフォーマーの内側と外側の両方から呼び出すことができる必要がありますcadr
。どうすればそれを達成できますか?
私の質問が Racket の構文モデル、特に「フェーズ レベル」の概念に関係していることは知っていますが、実際には理解できません。それを説明するわかりやすいチュートリアルを提供できれば、さらに感謝します.