2007年 11月 07日

Lua で Blosxom クローン

http://coderepos.org/share/browser/lang/lua/bluasxom/bluasxom.lua

ファイル列挙するのが生の Lua でできないので ruby よんで解決。他の部分は Lua だけでかいた。Class と List は前に RO 用に書いたのをそのままつかった。reverse を定義していないことにきづいたけど sort の等号変えてアドホック解決。Lua の文字列リテラルはおもしろくて

[[...]]
[=[ ... ]=]
[==[ ... ]==]
[===[ ... ]===]

みたいに = をふやして入れ子にできる。コメントなんかも複数行書きたいときは -- のあとにコレかくんだけど、これのおかげでテンプレートのコンパイルのときに楽をしてる。それとテンプレートの include (コンパイル時に処理しないといけない) とかも入れこにできるから簡単かも。実装してないし、してもあんま意味がないのだけど……

テンプレートへの値のうけわたしは setfenv (set function environment) でやってる。Lua では文字列の eval をしたいとき、 loadstring で文字列を評価する関数をつくって、それをよぶという感じなので、loadstring のかえす関数に setfenv をよんでやれば環境が変更できる (これは Ruby でいうところの binding を指定して eval してるようなものだけど、環境も Lua ではただのテーブルなのでより柔軟性がある)。

ただ、たんにテンプレートでつかう値だけを入れたテーブルを setfenv すると os.date とか組みこみの関数がテンプレ内からつかえなくて泣けるので、グローバル環境から一段階値をコピーしてからセットしてる。やっぱ環境に直接さわれるのはおもしろい。JS もさわれたらいいのになぁ。