如何定义一个接受可变数量参数并处理每个参数的 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>
如何定义一个接受可变数量参数并处理每个参数的 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>
我将提出此作为解决方案,但我不能保证它不包含引用错误。
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 引用规则非常不确定,以至于我真的不知道会发生什么,所以我怀疑存在引用错误。帮助表示赞赏。