soranoba
soranoba Author of soranoba.net
programming

bbmustache 1.6.0をリリースしました

リリースしました.
前回が去年の今頃なので年次更新みたいになってますね. stableなテンプレートエンジンなので大分メンテが楽です.

さて, 今回はpartial (templateの引用機能. {{> template_file}}のように使います) を使い, そのファイルが存在しない場合に無限ループするバグの修正がメインです.
無限ループバグとか初心者かよ〜と思いながら修正していたのですが, 修正しながら思ったことを雑記がてら書くことにします.

deprecated function / deprecated type

mustacheはpartialの対象ファイルが存在しない場合は空文字とみなす仕様なのですが, 今回, ファイルが存在しなかった場合パース時点で例外を投げて止められるようにraise_on_partial_missのoptionを追加しました.
1.5.0で追加したraise_on_context_missと似たような機能ですが, こちらがcompile時点なのに対し, parse時点であるのが大きな違いです.
raise_on_partial_missは指定せずに, raise_on_context_missを指定することでcompile時点例外にすることもできます.

これらの対応をするにあたり, option()というtypeを分割する必要がありました. option()なんて型名レビューがあったら確実に弾くようなものなんですが, 一人で書いていると仮名称のままになるという例です.

そう. 型の廃止です.
セマンティックバージョニングだと, minorではdeprecatedのマークのみを入れ, majorで実際に削除することになっているのですが, 今までerlangでdepreactedを使ったことがなかったのです. なので調べました.

deprecated functionの場合は, xrefに記載があるので, 以下のように書けば良さそうです.

-deprecated({function_name,arity}).

で、deprecated typeは….?
dict()がなくなった時のcommitを見ると何やらハードコードされている箇所があります. 困りました.

とりあえず, 型定義は残してコメントでdeprecatedって書いて対応しました. コンパイル時にエラー出ないけど.

無限ループとCommonTest

eunitの場合はタイムアウトがデフォルトで設定されているので問題ないのですが, CommonTestはタイムアウトがありません.
昔書いた「1年目のErlangプログラマが嵌まる20のポイント」にやり方が書かれていますが, timetrapを入れる必要があります.
なんでbbmustache設定されてないんだよ〜と思いつつも, 今回も設定しませんでした. 怠慢です.

ベンチマーク

bbmustacheとmustach.erlの速度比較用のテキトーに書いたスクリプトで速度図っているんですが, 今回今まで作業していたVMが吹っ飛んだ関係で全然違う値になりました.
バージョン差ではなく, 二つのライブラリの速度比較がしたかっただけなので, あまり気にはしていないものの, こういうのってなんかいい方法あるのだろうか…..

そんなことを思いながら修正作業をしていました.

(Updated: )

comments powered by Disqus