如何定义接受可变参数的 M4 宏?

reb*_*oob 2 m4

如何定义一个接受可变数量参数并处理每个参数的 M4 宏?我看过“shift”和“foreach(来自示例)”宏,但似乎无法使用它们组合我自己的宏。谢谢你的帮助。

define(UL, `wrap each arg in <li> tag, then wrap the whole output in <ul>')

UL(foo, bar, baz) #returns <ul><li>foo</li><li>bar</li><li>baz</li></ul>
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

我将提出这个作为解决方案,尽管我不保证它不包含引用错误。

define(`UL',`<ul>IT($@)<\ul>')dnl
define(`LI',`ifelse(`$1',`', `', `<li>`$1'<\li>')')dnl
define(`IT',`ifelse(`$#', `0',, `$#', `1',`LI(`$1')', 
    `LI(`$1')IT(shift($@))')')dnl
dnl
UL(foo,bar,baz)
UL(`UL',`LI',`IT')
UL(``UL'',``LI'',``IT'')
Run Code Online (Sandbox Code Playgroud)

对于后代,这是我的原始解决方案,其中肯定包含引用错误:

define(`UL',`<ul>IT($@)<\ul>')dnl
define(`LI',`ifelse(`$1',`', `', `<li>$1<\li>')')dnl
define(`IT',`ifelse(`$#', `0',, `$#', `1',`LI(`$1')', 
    `LI(`$1')IT(shift($*))')')dnl
dnl
UL(foo,bar,baz)
UL(`UL',`LI',`IT')
UL(``UL'',``LI'',``IT'')
Run Code Online (Sandbox Code Playgroud)

在第一个解决方案,最后调用UL不正是我期待的,但我是如此不确定的M4引用规则,我真的不知道会发生什么,所以我怀疑一个引用错误。帮助表示赞赏。