次: Indir, 前: Defn, 上: Definitions
あるマクロを一時的に再定義しておき、後で元の定義に戻すことができます。
それにはdefineとundefineに良く似た、
組み込みマクロpushdefとpopdefを使います。
pushdef(name [, expansion])
popdef(name)
これらのマクロはスタック(stack)に似た仕組みで機能します。
pushdefは、あるマクロを一時的に再定義します。
このときnameの前の定義は、新しい定義によって置き換えられる前に
保存されます。もし前の定義が存在しない場合は、
pushdefはdefineとまったく同じように機能します。
あるマクロに複数の定義が存在する場合(その中の一つだけがアクセス可能です)、
popdefを使って一番上の定義を削除することができます。
前の定義が無い場合、popdefはundefineのように機能します。
define(`foo', `Expansion one.')
=>
foo
=>Expansion one.
pushdef(`foo', `Expansion two.')
=>
foo
=>Expansion two.
popdef(`foo')
=>
foo
=>Expansion one.
popdef(`foo')
=>
foo
=>foo
defineによって、複数の定義を持つマクロを再定義したときは、
一番上の定義が新しい定義で置き換えられます。
undefineによって定義を削除するときは、
一番上のもの一つだけではなく、すべての定義が削除されます。
define(`foo', `Expansion one.')
=>
foo
=>Expansion one.
pushdef(`foo', `Expansion two.')
=>
foo
=>Expansion two.
define(`foo', `Second expansion two.')
=>
foo
=>Second expansion two.
undefine(`foo')
=>
foo
=>foo
pushdefとdefnを使えば、組み込みマクロを一時的に再定義することが
できます。
マクロpushdefとpopdefは引数を与えたときだけ認識されます。