define-syntax (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

マクロを作成します。マクロは、Curl プレフィックス式を後でコンパイルする他のフォームに変換するデバイスです。

説明

define-syntax は、次の 2 つの相違点を除き、define-macro と同じです。
  1. macro-env:MacroEnv を暗黙の引数として取る代わりに、syntax-env:SyntaxEnv を取ります。SyntaxEnvMacroEnv のサブクラスで、追加機能によって (コンパイル時の式の型についてコンパイラをクエリする機能など) これを拡張しています。このため、define-syntax で作成されるマクロは define-macro で作成されるマクロより強力なものになります。
  2. define-macro と異なり、define-syntax で作成されたマクロは、コード ステートメントが存在する状況でのみ (プロシージャまたはメソッドの内部など) 呼び出すことができます。
    たとえば、グローバル変数、プロシージャ、クラスまたはクラス内のメソッドは実行可能なコード ステートメントではないので、define-macro のマクロではこれらを宣言できますが、define-syntax のマクロではできません。
ほとんどの場合は define-macro の代わりに define-syntax を使っても問題はなく、より強力です。マクロがコード ステートメント以外の何か (クラス定義など) を返す必要がある場合に限り、define-macro を使う必要があります。
時には、マクロの戻り値が引数によって決まるため、何が返されるかわからない場合があります。たとえば、条件つきのコンパイル マクロは define-class または他の言語コンストラクトにラップされるように define-macro を使って記述するのが最適な方法といえます。