マクロ
Neotonic ClearSilverもマクロをサポートしています。
サポートのための2つのコマンド、defでマクロを定義し、callで呼び出します。ここではマクロ定義の例を示します。このマクロは、変数の値が、データセットの一部にあれば展開します。
<?cs def:map_val(val, map) ?>
<?cs each:item = map ?>
<?cs if:val == item ?>
<?cs var:item.val ?>
<?cs /if ?>
<?cs /each ?>
<?cs /def ?>
以下のデータセットを呼ぶかもしれません。
Lang.Dates { Weekdays { 0 = 0 0.val = Sunday 1 = 1 1.val = Monday 2 = 2 2.val = Tuesday 3 = 3 3.val = Wednesday 4 = 4 4.val = Thursday 5 = 5 5.val = Friday 6 = 6 6.val = Saturday } }
<?cs call:map_val(#6, Lang.Dates.Weekdays) ?>
これは、”Saturday”の出力になります。
実際は、出力が多くの空白文字を含みそうである点に注意してください。
これは、各々の反復の副作用である。
出力ストリームに渡されるCSタグの外にある空白がループの反復ごとに一度含まれます。
空白なしでmap_val関数を定義したい場合があります。
これを行う方法は、お互いにすべてのタグを持つ一つの大きな長い行を作成することです。
テンプレートタグの内側に空白が渡されていないので、タグ内、またはコメントタグ内の空白を非表示にすることができます。
<?cs def:map_val(val, map) ?><?cs each:item = map
?><?cs if:val == item
?><?cs var:item.val ?><?cs
/if ?><?cs
/each ?><?cs
/def ?>
また、マクロ引数は、引数の4つのタイプのいずれかとすることができることを、この例から見ることができます。
アイテムのパラメータとして文字列または数値を渡すならば、データセットの一部であると予想されるパラメータ、すなわち、奇妙なことが起こります。
あなたは”wow”などの項目を渡し、そして、あなたが”wow”買ってあげるitem.fooを求める場合にはいくつかのケースでは、それは常に値、すなわちに評価されます。
あなたが項目の子を求めるなら、それはあなたが狂っていると思うし、その代わりに、グローバル変数のような項目を意味していることを仮定し、その名前の下にデータセットでそれを検索します。