基本的に次のようなマクロがあります。
#macro( surround $x )
surround:$x
$bodyContent
/surround:$x
#end
呼び出し#@surround("A")bunch o' stuff#end
により、期待どおりに「surround:A bundle o' stuff /surround:A」が生成されます。呼び出しにより、 Surround #@surround("A")#@surround("B")more stuff#end#end
:A Surround:B more stuff /surround:B /surround:A が生成されます。これはまさに私が望むものです。
でも今は別のマクロで上向きにビルドしたい
#macro( annotated-surround $x $y )
#@surround( $x )
annotate:$y
$bodyContent
#end
#end
意図した展開#annotated-surround( "C" "note" ) stuff #end
は Surround:C annotate:note stuff /surround:C です
...しかし、これは機能しません。注釈付きサラウンド ボディ コンテンツの恐るべき半無限拡張を取得します。
Closure in Velocity template macros で回答を読みましたが、やりたいことが可能かどうかまだよくわかりません。
#surround
と
の定義内で勝手にトリッキーなことをして#annotated-surround
も構わないと思っていますが、それらのマクロのユーザーに複雑さを感じてほしくないのです。全体のアイデアは、彼らの生活を簡素化することです。
私があなたの耳を持っている限り:設定macro.provide.scope.control=true
は「マクロのローカル名前空間」に想定されています。これは何を意味するのでしょうか?指定された名前空間はデフォルトのコンテキストから独立していますが、すべてのマクロのすべての呼び出し間で共有される単一のそのようなスペースがありますか? それとも、再帰的であっても、マクロ呼び出しごとに個別のコンテキストが提供されますか? という理由で後者でなければなり$macro.parent
ませんよね?
そして、さらに別の質問です。次のマクロを検討してください。
#macro( recursive $x )
#if($x == 0)
zero
#else
$x before . . .
#set($xMinusOne = $x - 1)
#recursive($xMinusOne)
. . . $x after
#end
#end
#recursive( 4 )
収量:
4 前に。. . 3 前に。. . 2 前に。. . 1 前に。. . ゼロ 。. . 0 後。. . 0 後。. . 0 後。. . 4後
これで、「0」のすべての出現を理解できました。グローバルな $x は 1 つしかないため、再帰呼び出しでそれに割り当てると、それが破壊され、復元されません。しかし、その最後の「4」は一体どこから来たのでしょうか? さらに言えば、私の最初の「サラウンド」マクロが任意の深さまで機能するのはどうしてですか。最後の $x が内部呼び出しで破壊されないのはなぜですか?
長くなって申し訳ありませんが、この件に関して明確な文書を見つけることができませんでした。