(macro 《記号》《lambda式》) 【特殊フォーム】
(macro (《記号》《変数》)《本体》) 【特殊フォーム】
macro式は上のように2つの形があり,はじめの
では 《lambda式》の値を展開関数とする 《記号》 という名の マクロを定義する. 以後,《記号》 はマクロ記号となる. 《lambda式》の値は(macro 《記号》 《lambda式》)
(macro (《記号》 《変数》) 《本体》)は
(macro 《記号》 (lambda (《変数》) 《本体》))と等価である. macro式はトップ・レベルでのみ意味を持ち, トップ・レベル以外で使用した場合の動作は保証しない. macro式は 《記号》 を値として返す.
《記号》 を第要素とするリスト・フォーム(マクロ・フォーム)を
評価する場合は,そのフォーム全体を引数としてマクロ展開関数を呼び出し,
戻ってきた値を再び評価する.
例:
> (macro when
(lambda (form)
`(if ,(cadr form)
(begin ,@(cddr form)))))
when
> (define x 0)
x
> (when #t (set! x 100) (+ x 2))
102
マクロを解除するには, defineを用いて, その 《記号》 に大域変数として何らかの値を与えればよい.
例:
> (macro unless
(lambda (form)
`(if (not ,(cadr form))
(begin ,@(cddr form)))))
unless
> (unless (< 3 2) (- 3 2))
1
> (define unless list)
unless
> (unless (< 3 2) (- 3 2))
(#f 1)
〈データ〉 がマクロ記号なら,そのマクロ展開関数を返す. そうでなければ, #fを返す.