2

如何定义一个接受可变数量参数并处理每个参数的 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>
4

1 回答 1

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

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

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 引用规则非常不确定,以至于我真的不知道会发生什么,所以我怀疑存在引用错误。帮助表示赞赏。

于 2013-06-06T12:56:28.367 回答