2013-06-05 74 views
2

如何定義接受可變數量參數並處理每個參數的M4宏?我已經看過「shift」和「foreach(來自示例)」的宏,但似乎無法使用它們組合我自己的宏。謝謝你的幫助。如何定義接受可變參數的M4宏?

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

我會提出這個解決方案,雖然我不能保證它不包含引用錯誤。

define(`UL',`<ul>IT([email protected])<\ul>')dnl 
define(`LI',`ifelse(`$1',`', `', `<li>`$1'<\li>')')dnl 
define(`IT',`ifelse(`$#', `0',, `$#', `1',`LI(`$1')',  
    `LI(`$1')IT(shift([email protected]))')')dnl 
dnl 
UL(foo,bar,baz) 
UL(`UL',`LI',`IT') 
UL(``UL'',``LI'',``IT'') 

對於後人,這是我原來的解決方案,這當然不包括引用錯誤:

define(`UL',`<ul>IT([email protected])<\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最終調用是不正是我期望的,但我m如此不確定的m4引用規則,我真的不知道會發生什麼,所以我懷疑引用錯誤。幫助讚賞。

+0

太棒了!關於這裏發生的事情的任何提示?謝謝一堆! – rebnoob

+0

'UL'在參數列表的周圍放置'

    '標籤,''LI'放置'
  • '標籤圍繞其參數,'IT'遍歷列表。 –

    相關問題