如何定义接受varargs的M4宏?

时间:2013-06-05 19:09:49

标签: m4

如何定义接受可变数量的参数并处理每个参数的M4宏?我看过“转移”和“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>

1 个答案:

答案 0 :(得分:4)

我会建议将此作为解决方案,但我不保证它不包含引用错误。

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'')

对于后代,这是我的原始解决方案,当然确实包含引用错误:

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'')

在第一个解决方案中,UL的最终调用并不完全符合我的预期,但我不太清楚m4引用规则我真的不知道会发生什么,所以我怀疑< em>是引用错误。帮助赞赏。