テンプレートエンジン


Velocityっぽいテンプレートエンジンをやる場合、仕様はどうする?

Velocityについて

## Velocityと違って、Airspeedでこれは文法エラーみたい
#set($foo = 1 == 1)

## Velocityなら、先に「1 == 1」が評価され、結果が$fooに代入される
## よって $fooの値はtrue

Velocityメモ

## Velocityはリストのリテラル中に演算子を記述できない
## 以下はerrorとなる
#set($foo = [1 * 2, 2 * 2, 3 * 2])
## Velocityは空リストの中にスペースを記述できない
## 1.4では以下はerrorとなる(仕様なのか実装のバグかは不明)
#set($foo = [ ])

## 以下は問題ない
#set($foo = [])
## Velocityは行継続に対応してない
## 以下はerrorとなる
#set($foo = 3 +
4)

検討項目

文法を少し変更する

以下のディレクティブの記法は、velocityでは無効

#foreach($x in $list)
#  if($x)
      True
#  else
      False
#  end
#end

なぜなら、「#」とディレクティブ名の間に空白が含まれるから
でも個人的には許容したい
というのも、「#」を行頭に持ってきて、
「#」とディレクティブ名の間にインデントを入れる記法が好みなので・・・
(でもその記法は一行一ディレクティブが前提か)

演算子の優先順位(弱い順)

parse時に解決されるディレクティブを取り入れる?

その他

暫定版

heieiei.080815a.tar.gz
名前は適当にheieiei(ハイアイアイ)という名前にする
これは架空の島の名前が由来

memo.txt

こんな感じ

(use heieiei)
(template
  (
    (foo '(1 2 3 4 5))
    (bar #t))
  (call-with-input-file "example.tmpl" port->string))

example.tmplの中身はこんな感じで

<ul>
#foreach($x in $foo)
  <li>$x</li>
#end
</ul>

#if($bar)
  TRUE!!
#else
  FALSE!!
#end

暫定版の実装メモ

 '(1 + 2 * 3 == 7 and true)
 (and
   (==
     (+
       1
       (*
         2
         3))
     7)
   true)
 #set($num = 1 . 2 . 3)
 #set($str = "str1" . ":" . "str2")
 #set($arr = [1,2,3] . [7,8,9])

$numは「123」、$strは「"str1:str2"」、$arrは「[1,2,3,7,8,9]」
リスト同士の場合はリストをappendしたリストを返すが、それ以外のものは文字列表現を結合して返す

TODO


Last modified : 2008/12/29 22:35:15 JST