すでに定義済みのマクロの名前を替えることができます。
それには組み込みマクロdefn
が必要となります。
defn(name)
これはnameの定義をクォートしたものに展開されます。 引数が定義済みのマクロでないときは展開されると消滅します。
nameがユーザ定義マクロの場合、
クォートされた定義とは単にクォートされた展開用テキストのことです。
nameが組み込みマクロの場合、
展開後のテキストは、m4
の内部にある組み込みマクロの定義を指す
特殊なトークンとなります。
このトークンは、define
(および pushdef
)
の第2引数としてのみ意味を持ち、その他の文脈では無視されます。
通常の使用方法は、次の例でundefine
の名前をzap
に換える方法を
見るのが一番分かりやすいでしょう。
define(`zap', defn(`undefine')) ⇒ zap(`undefine') ⇒ undefine(`zap') ⇒undefine(zap)
このようにdefn
はユーザ定義マクロの定義や
組み込みマクロの定義をコピーするために使うことができます。
たとえ元のマクロが削除されても、もう一方の名前を使って
定義にアクセスすることができます。
defn
は引数を与えたときだけ認識されます。