Smartyを調べている

XslateSmartyをサポートしたらいいのに、という要望があったので、Smartyを調べている。Smartyは極力「プログラミング」をできないようにしているようで、確かに使いやすそうだ。
調べてみるとcycle関数が面白そうなのでとりあえずXslateに似た機能を実装してみた。以下のようにすると、"even"と"odd"を交互に表示する。

#!perl
use strict;
use Text::Xslate;
my $tx = Text::Xslate->new();
print $tx->render_string(<<'T');
: for [1, 2, 3, 4] -> $item {
    <: $~item.cycle("even", "odd") :>
: }
T
__END__

Template Toolkit 2にはloop.evenloop.oddというイテレータ要素があるのだが、これはループカウントが1から始まるため、odd -> even -> odd ...という順で真になる。これはエンジニアとしてはまったく直観的ではないし、かといって逆にするのも混乱を助長するだけなのでよくない*1。しかしこのcycle()ならば直観的に使えるだろう。
TT2のodd/evenと同じように、真->偽というサイクルがほしいならば以下のようにすればよい。

: for [1, 2, 3, 4] -> $item {
    : if $~item.cycle(true, false) {
        ...
    : }
: }

あるいは、偽->真というサイクルがほしいならば逆にすればよい。

: for [1, 2, 3, 4] -> $item {
    : if $~item.cycle(false, true) {
        ...
    : }
: }

なお、Smartyのcycleには様々なオプションがあるが、それらはサポートしていない。

*1:と、id:tokuhiromに反対された