1

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 の構文モデル、特に「フェーズ レベル」の概念に関係していることは知っていますが、実際には理解できません。それを説明するわかりやすいチュートリアルを提供できれば、さらに感謝します.

4

1 に答える 1