では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
パラメータでのみ識別できます。