GMTみなさんはコードジェネレータを使った事があるでしょうか。はてはPHPまで、Rubyでコードジェネレータを使う機会は増すばかりです。Rubyでコードジェネレーションと言えばERbを使うことが多いですが、それで充分なのでしょうか。他の選択肢はどうでしょうか。今日は、wlangというコードジェネレータを紹介します。engine?次のサンプルコードを見てください。シンプルなHTMLテンプレートエンジンのように見えます。</ul></div>EOSこのプログラムの出力結果はこうなります。Giraffe</div>コンテキストに合わせて正しく、'や&がエスケープされているのがわかります。記法にはあまり馴染みがありませんが、配列の展開もうまく動いています。engine次にwlangの仕組みを見ていきます。wlangでは、wlangタグを使って、テンプレートを記述します。wlangタグは次のような形式です。記号{.....}{.....}{.....}後ろの{}はblockと呼ばれ、任意の個数持つ事ができます。全て、wlangタグだったのでした。末尾の”はwlangタグとは関係なく、ただの文字列です。id="{name}'>が文法エラーを出さずに動作する事で確認できます。このセンス嫌いじゃない)なにやらあやしいかおりがしてきました。language?次に、WLang::instantiateの第三引数は”wlang/xhtml”となっていますが、WLangではこれをdialect(方言、なまりの意味)と呼んでおり、当然変えられます。'O''Reilly';このように、dialect毎に'{...}タグの動作が変わるわけです。dialectは複数のRuleSetとEncoderSetで定義されています。RuleSetはタグの機能をオーバライドしたり新たなタグを定義します。^{..encoding..}{...}というタグで呼び出す事ができます。以下は大文字に変換するencodingの例です。定義され、それぞれ違うエスケープがされるようになっています。先のwlang/sqlとwlang/sql/sybaseの結果の違いも、ここで決まっています。double-quotingを呼び出すためのショートカットになっています。エスケープに悩まされることなく気楽にコード生成を行う事ができるwlangかっこいい!でも、encodingの実装にバグがあるっぽくて、まだそれは無理っぽい。GMT紹介しようと思ったのですが、こちらにて詳細にまとめられていたので参照してください。すごいポイントはいくつかありますが、特にテーブル編集中に自動でセルサイズが再計算されるのが感動です。pre中でも再レイアウトされるのは残念。現在のバージョンはいくつか相違点がありました。KimさんはVim好きそうな名前ですね。bindingを書いていて、やっぱりGC周りではまってしまった。rootからの参照を一度に消されるとどうしようもない。そこで試しに以下のようなコードを書いてみたところうまくいった。obj5]以下軽く解説。OrderedFinalizerに解放順序を指定したいオブジェクトへのリファレンスを保持させる。reference(つまりobject_id)で持つ。referenceなオブジェクトが解放されていたら、次のオブジェクトの参照をweakにする。OrderedFinalizerはat_exitで参照されているので、Ruby界では最後まで生き残る。stepを各GC毎に呼ぶのが理想なのだが、そんなイベントはないよなぁ。今回の用途には足るんだけど、今のままだと、最後までいくらかのオブジェクトを保持してしまう。obj1からobj2へのリファレンスがあったりすると無限ループになるし、[true]とか渡してやるとかも困る。