% Accessor MACRO-FUNCTION
Accessor MACRO-FUNCTION
macro-function
symbol &optional environment => function
(setf
(macro-function
symbol &optional environment) new-function)
symbol - シンボル
environment - 環境オブジェクト
function - マクロ関数か、nil
new-function - マクロ関数
指定されたenvironment下で、 symbolがマクロとして定義されている関数を持っているかどうかを決定します。
もしマクロ展開関数であれば、それは2つの引数の関数が返却されます。
symbolがレキシカルな環境内のenvironmentに関数が定義されていないか、
あるいはその定義がマクロではなかったときは、
macro-function
はnil
を返却します。
symbolはmacro-function
とspecial-operator-p
の
両方がtrueになることが可能です。
マクロ定義は、Common Lispの標準の特殊フォームのみを理解できる プログラムによって使うことができるようにしなければなりません。
(defmacro macfun (x) '(macro-function 'macfun)) => MACFUN
(not (macro-function 'macfun)) => false
(macrolet ((foo (&environment env)
(if (macro-function 'bar env)
''yes
''no)))
(list (foo)
(macrolet ((bar () :beep))
(foo))))
=> (NO YES)
(setf macro-function)
,
defmacro
,
macrolet
setf
でmacro-function
を使用するときに、
environmentがnil
ではなかったときの結果は未定義です。
defmacro
,
3.1. 評価
setf
はmacro-function
と共に使うことで、
シンボルのグローバル関数定義としてマクロを導入できます。
例えば下記の通り。
(setf (macro-function symbol) fn)
導入するされる値は、2つの引数を受け取るfunctionでなければなりません。 引数はマクロコール全体と、環境オブジェクトであり、 呼び出されるとその展開を計算します。 この操作の実行は、symbolにグローバル関数定義として マクロを一つだけ持たせることであり、 以前のマクロ定義や関数定義は失われます。