将宏扩展为 `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.但是,当然,前两行之后扩展为字符串的任何其他行MACRO也可以。


背景。我想使用 ,patsubst比如说在其中替换逗号来对宏的扩展进行替换。很遗憾

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

产生x,y,z,因为替换是在字符串上执行的MACRO。但如果宏的扩展包含逗号,则变体

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

第二行首先扩展为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()返回其每个参数的引用定义。在上面的第二个示例中,我们使用它来获取带引号的字符串x,y,z( 的带引号的值MACRO)。然后将其移交给patsubst它将逗号更改为点。

POSIX 标准m4关于这个宏有这样的说法:

defn

宏的定义文本defn应为其参数的引用定义(使用当前引用字符串)。如果 defn 后面没有紧跟着 a <left-parenthesis>,则行为未指定。

对于 BSD 来说m4defn()已记录作为

defn(name, ...)

返回每个参数的引用定义。这可用于重命名宏定义(甚至对于内置宏)。

GNUm4有(在m4 info文档),

内置:defn (NAME...)

扩展到引用的定义每个NAME。如果参数不是已定义的宏,则该参数的扩展为空。

如果NAME是用户定义的宏,则引用的定义只是引用的扩展文本。相反,如果只有一个NAME 并且它是内置函数,则扩展是一个特殊标记,它指向内置函数的内部定义。该标记仅作为define(and pushdef) 的第二个参数才有意义,并且在大多数其他上下文中会默默地转换为空字符串。不支持将内置函数与其他任何内容相结合;会发出警告,并且最终扩展中会省略内置函数。

defn只能通过参数来识别。

相关内容