npt-japanese

% Accessor MACRO-FUNCTION

UP


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-functionnilを返却します。

symbolmacro-functionspecial-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

例外

setfmacro-functionを使用するときに、 environmentnilではなかったときの結果は未定義です。

参考

defmacro, 3.1. 評価

備考

setfmacro-functionと共に使うことで、 シンボルのグローバル関数定義としてマクロを導入できます。 例えば下記の通り。

(setf (macro-function symbol) fn)

導入するされる値は、2つの引数を受け取るfunctionでなければなりません。 引数はマクロコール全体と、環境オブジェクトであり、 呼び出されるとその展開を計算します。 この操作の実行は、symbolにグローバル関数定義として マクロを一つだけ持たせることであり、 以前のマクロ定義や関数定義は失われます。


TOP, Github