Next: , Previous: Defn, Up: Definitions


4.6 マクロの一時的な再定義

あるマクロを一時的に再定義しておき、後で元の定義に戻すことができます。 それにはdefineundefineに良く似た、 組み込みマクロpushdefpopdefを使います。

     pushdef(name [, expansion])
     popdef(name)

これらのマクロはスタック(stack)に似た仕組みで機能します。 pushdefは、あるマクロを一時的に再定義します。 このときnameの前の定義は、新しい定義によって置き換えられる前に 保存されます。もし前の定義が存在しない場合は、 pushdefdefineとまったく同じように機能します。

あるマクロに複数の定義が存在する場合(その中の一つだけがアクセス可能です)、 popdefを使って一番上の定義を削除することができます。 前の定義が無い場合、popdefundefineのように機能します。

     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

pushdefdefnを使えば、組み込みマクロを一時的に再定義することが できます。

マクロpushdefpopdefは引数を与えたときだけ認識されます。