next up previous contents index
: 数値 : TUTSchemeのマニュアル Version 1.51 : 遅延評価   目次   索引

マクロ

(macro 《記号》《lambda式》) 【特殊フォーム】

(macro (《記号》《変数》)《本体》) 【特殊フォーム】

macro式は上のように2つの形があり,はじめの
(macro 《記号》 《lambda式》)
では 《lambda式》の値を展開関数とする 《記号》 という名の マクロを定義する. 以後,《記号》 はマクロ記号となる. 《lambda式》の値は$1$引数の関数でなければならない. もう一方の
(macro (《記号》 《変数》) 《本体》)
(macro 《記号》 (lambda (《変数》) 《本体》))
と等価である. macro式はトップ・レベルでのみ意味を持ち, トップ・レベル以外で使用した場合の動作は保証しない. macro式は 《記号》 を値として返す.

《記号》 を第$1$要素とするリスト・フォーム(マクロ・フォーム)を 評価する場合は,そのフォーム全体を引数としてマクロ展開関数を呼び出し, 戻ってきた値を再び評価する.

例:


> (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)

(macro-function 〈データ〉) 【関数】

〈データ〉 がマクロ記号なら,そのマクロ展開関数を返す. そうでなければ, #fを返す.



Tsuneyasu KOMIYA 平成14年2月22日