MovableType4になってからテンプレートタグが大幅に強化されました。同時にテンプレート内で利用できる変数関係の操作も強化され、これによってテンプレートをプログラミング言語のように構造化して扱うことができるようになっています。
今回、頭の体操も兼ねて MovableType のテンプレートタグだけを用いてフィボナッチ数を計算してみました。…実用性は多分ありません。
フィボナッチ数のような数列の計算は、C言語の演習などでは再帰関数の例として良く目にするほど有名です。MovableType4になって追加された<MTSetVarTemplate>テンプレートタグを利用すると、テンプレートタグを関数のように扱うことができます。しかも、自分自身を呼び出すことで擬似的に再帰関数を実現できてしまうのでした。
ただし、<MTSet/GetVar>で扱える変数がグローバル変数のみで、ローカル変数やレキシカル変数は存在しないため、変数の局所化ができません。そのため、記述方法がC言語の関数とは少し赴きが違ってきます。
<MTSetVar name="fib" index="1" value="1">
<MTSetVar name="fib" index="2" value="1">
<MTSetVarTemplate name="Fibonacci">
<MTUnless name="fib" index="$fib_x">
<MTSetVar name="fib_x" op="--">
<MTSetVarBlock name="fib_1"><MTGetVar name="Fibonacci" regex_replace="/s+/",""></MTSetVarBlock>
<MTSetVar name="fib_x" op="--">
<MTSetVarBlock name="fib_2"><MTGetVar name="Fibonacci" regex_replace="/s+/",""></MTSetVarBlock>
<MTSetVar name="fib_x" op="++">
<MTSetVar name="fib_x" op="++">
<MTSetVar name="fib" index="$fib_x" value="$fib_1">
<MTSetVar name="fib" index="$fib_x" value="$fib_2" op="+">
</MTUnless>
<$MTGetVar name="fib" index="$fib_x"$>
</MTSetVarTemplate>
<MTSetVar name="fib_x" value="10">
fib(<$MTGetVar name="fib_x"$>) = <$MTGetVar name="Fibonacci" regex_replace="/s+/",""$>
メモ化しているのでfib(100)程度であれば難なく計算できるようですが、あまりに大きな項を求めようとすると、サーバと心中することになるかもしれません。パフォーマンスは恐ろしく悪いでしょうね(笑)