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