(rontolisp) docs
← 関数

macro-function

(macro-function symbol &optional environment)

symbol のマクロ展開器を返します。名前が関数、25 個の特殊オペレータのいずれか、または未知の場合は nil です。defmacro で定義したユーザマクロ、すべての組み込みマクロ(rontolisp:list-macros が報告する名前)、そして rontolisp が独自に特殊形式として実装している Common Lisp のマクロ(defunhandler-casedolist など)に対して非 nil を返します — 合わせて「apply してはいけない名前」のすべてです。

environment 引数は受け取って無視します。macrolet の本体は実行前に展開され尽くすため、参照できるのはグローバルな答えだけです。

インタープリタでは値は本物の展開器で、(funcall expander form environment) として 1 段階の展開を実行できます。

コンパイル済みプログラムにはマクロテーブルが残っていない(バックエンドが見る前にマクロは完全展開される)ため、そこでの値はスタブです。上記の述語としての用途は 4 バックエンドすべてで正確ですが、呼び出すと macro-function: a compiled program cannot expand a macro at run time をシグナルします。

setf の場所としては 1 つの形だけをサポートします。(setf (macro-function 'new) (macro-function 'existing)) は既存の defmacro 定義マクロに 2 つ目の名前を与え、展開器を共有させます。以降、両方の名前は同一に展開されます。それ以外 — 任意の展開器関数や、ユーザマクロでない名前 — はエラーをシグナルします。保存すべきマクロ関数オブジェクトが存在しないためです。

ライト版: シンボル以外の引数は、Common Lisp が型エラーをシグナルするところで nil を返します。