`m4`の引用符でマクロを拡張する

`m4`の引用符でマクロを拡張する

ではm4、マクロを展開してすぐに引用符で囲むことはできますか?つまり、むしろ

define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
MACRO

拡張すると、次のようなHello!機能が欲しいです。qexpand

define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
qexpand(`MACRO')

HELLOただし、もちろん、文字列に展開される最初の2行以降の他の行も機能しますMACRO


背景patsubstたとえば、コンマを置き換えてマクロ拡張を変更したいとします。残念ながら

define(`MACRO',`x,y,z')dnl
patsubst(`MACRO',`,',`.')

x,y,z文字列に対して置換が行われたために生成されますMACRO。ただし、マクロ拡張にコンマが含まれている場合、バリアントは

define(`MACRO',`x,y,z')dnl
patsubst(MACRO,`,',`.')

2行目は最初に展開され、patsubst(x,y,z,`,',`.')エラーが発生しますWarning: excess arguments to builtin `patsubst' ignored。マクロを引用符で拡張できる場合は、この問題を解決できます。

ベストアンサー1

defn()あなたの機能ですqexpand()

define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
defn(`MACRO')

出力してHELLO

define(`MACRO',`x,y,z')dnl
patsubst(defn(`MACRO'),`,',`.')

出力されますx.y.z

defn()各パラメータの参照定義を返します。上記の2番目の例では、これを使用して引用符付き文字列x,y,z(引用符付き値MACRO)を取得します。その後、渡すとpatsubstコンマがドットに変わります。

POSIX規格m4このマクロについてはこんな言葉があります。

defn

マクロの定義テキストは、その引数のdefn参照定義でなければなりません(現在の参照文字列を使用)。 defnの後にaがない場合、<left-parenthesis>動作は指定されません。

BSDのm4場合、defn()マクロ録音済み〜のように

defn(name, ...)

各パラメータの参照定義を返します。これはマクロ定義の名前を変更するために使用できます(組み込みマクロの場合でも)。

GNUm4は(m4 info文書)、

内蔵:defn (NAME...)

次に展開引用された定義NAME。引数が定義されたマクロではない場合、引数の拡張は空です。

NAMEカスタムマクロの場合、引用定義は単に引用の拡張テキストです。逆に、1つだけがNAME 組み込み関数の場合、拡張は組み込み関数の内部定義を指す特別なタグです。このトークンはdefine(and)の2番目の引数としてのみ意味があり、他pushdefのほとんどのコンテキストでは空の文字列に自動的に変換されます。組み込み関数を他のものと組み合わせることはサポートされていません。警告が発生し、組み込み関数は最終拡張から省略されます。

マクロはdefnパラメータでのみ識別できます。

おすすめ記事