#:g1: yaclmlの紹介

Posted 2014-12-13 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の348日目です。

yaclmlとはなにか

 yaclmlは、Marco Baringer氏作のHTMLテンプレートエンジンです。

パッケージ情報

パッケージ名yaclml
Quicklisp
CLiKiCLiki: yaclml
Quickdocsyaclml | Quickdocs
CL Test Grid: ビルド状況yaclml | CL Test Grid

インストール方法

(ql:quickload :yaclml)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 Common LispのHTMLテンプレートエンジンには色々ありますが、cl-whoあたりがメジャーなところでしょうか。
やはりLispなのでS式で書きたいわけなのですが、yaclmlは、デザイナーにも優しいことも設計目標の一つらしいです。

 HTMLタグをキーワードシンボルで表現するcl-who等と違って

(<:tag ...)

 という風にHTML風の<パッケージにタグを定義していきます。
タグは関数/マクロになっているのでユーザーの拡張も簡単です。
こんな感じに書いたテンプレートがあったとすると、

(<:html
 (<:body
  (<:table
   (let ((col 0))
     (<:tr (<:td [~(incf col)]) (<:td [~(incf col)]) (<:td [~(incf col)]))
     (<:tr (<:td "foo") (<:td ["bar"]) (<:td "3"))))
  (<::unordered-list2 "foo" "bar" "baz")))

 これをこんな感じに呼び出せば、

(defmacro <::unordered-list (&body list)
  `(<:ul ,@(mapcar (lambda (x) `(<:li ,x)) list)))

(yaclml:with-yaclml-stream *standard-output* (with-open-file (in "/var/tmp/yaclml.lisp") (let ((*readtable* (copy-readtable nil))) (yaclml:enable-yaclml-syntax) (eval (read in))))) ;>> <html ;>> ><body ;>> ><table ;>> ><tr ;>> ><td ;>> >1</td ;>> ><td ;>> >2</td ;>> ><td ;>> >3</td ;>> ></tr ;>> ><tr ;>> ><td ;>> >foo</td ;>> ><td ;>> >&quot;bar&quot;</td ;>> ><td ;>> >3</td ;>> ></tr ;>> ></table ;>> ><ul ;>> ><li ;>> >foo</li ;>> ><li ;>> >bar</li ;>> ><li ;>> >baz</li ;>> ></ul ;>> ></body ;>> ></html ;>> > ;=> <no values>

という感じに出力されます。

 テンプレートの方はTALという名前らしいですが、「[」から「]」の間で、

の特殊文字が使えます。

まとめ

 今回は、yaclmlを紹介してみました。
このブログもyaclmlで書いていますが、拡張はしやすい気はしています。

comments powered by Disqus