テンプレートエンジンと関数型言語(思案中)

HTMLテンプレートと関数型言語の関係について、引き続き思案中。
まだかなり浅いんだけど一旦output。

関数型っぽいと思うところ

  • あらかじめ用意したテンプレートに値を渡すと出力用の文字列が帰ってくるという時点で、まずは関数っぽい。
  • 変数値write系のタグは、評価すると変数の値を戻す関数と見立てられないか
  • forとかforeach系のタグは、内部を繰り返し評価するわけだから、関数に関数を渡す高階関数と見立てられないか
  • include時にパラメータが渡せ、専用のスコープが作られる今風のテンプレートエンジンの場合、再帰的にincludeすることもできる(Masonとかでもね。というかWebObjectsは昔からこれが出来た。) これって関数の再帰呼び出しみたいなもんじゃないか

テンプレートエンジンの挙動を手続き的/関数的表現で表すと、大体下のような感じになるかと思う。

手続き的(命令的) 関数的(宣言的)
テンプレート プログラム
テンプレートの適用 〃を実行し、随時ストリームに追記する 〃を評価して値を取得する
制御タグ 命令や制御構文 評価するべき関数
リテラル 内容をストリームに追記するという処理 値そのもの、または値を返す関数

あくまで見立てであって、具体的な処理内容に差異があるかとは別問題。

関数型(といわれる)テンプレートエンジン

ちょっと検索したけどそれっぽいのはあまり見つからなかった。

上の二個は確かに宣言型のプログラミング言語かもしれないけど、ちょっとイメージと違う……
のでXiについて少し調べてた。

プログラミング言語Xiについて

処理系の実装はJava。どんなものかについては、公式サイトに見に行って下さい。

XHTMLに制御タグを埋め込んだwell-formedなXMLとして記述するところはFaceletsなどと同じ。


適用処理の内容は、XiServletクラスとProcessorImplクラスから実装を追って行ったところ次のような感じだった(大分はしょっています。)

  1. テンプレートファイルからSAXパーサでModuleツリー*1を生成
    • Moduleツリー:元のXMLのDOMドキュメントの構造を反映したツリー
    • 元ファイルの中身との対応: エレメント→MElement, テキストノード→MTextなど、MNodeのサブクラスから構成される
    • org.baykit.xi.module.SAXHandler(とその親クラスのModuleHandler)を参照
  2. ModuleツリーからFunctionのツリーを生成
    • Xiのタグについては、それぞれに対応するFunction(の実装クラス)が生成される
    • Xiのタグ以外→LiteralElementFunctionクラス、LiteralTextFunctionクラス
    • Function生成時の処理についてはMNodeのサブクラス(特にMElement)のcreateFunction(Engine)の実装を参照
  3. FunctionのツリーをexecuteしてResultTreeを生成
    • ResultTree: DOM Nodeツリー + encodingやMIMEタイプなどの付加情報
    • 各Function実装のexecute(Engine)参照
  4. 必要ならResultTreeにXSLTなどの後処理を適用
    • ResultTransformerの実装クラスのOptTransformerクラス参照
  5. domの内容をresponseに出力

まとめ

Xiは、テンプレートファイルのDOMツリーをいろんな中間的なツリーに変形して行って、最終的に出力内容のDOMツリーを生成するという点は面白く、参考になりそう。最終的にFunctionをツリーの構造に沿って逐次的に実行してDOM Nodeを追加していくという処理であり、そういう意味では他の処理系とあまり変わらないような気がする。でも未踏のサイト見たらlambdaとか使えるとあったのでコードの読み込みが足りないだけかも。


じゃあお前の考える関数型テンプレートエンジンってどんなのよ?って話なんだけど、それはちょっとまだ考え中。というか基礎的な知識が全然ないので今更関数型言語の入門書読んでるところ……

*1:公式の用語ではなくて勝手に名付けた