perl
Template Toolkitはどういうわけか*1Perlにおける標準のテンプレートエンジンの座にいるが、その仕様は美しいとは言い難い。特にまずいのは、 あるトークンの意味がコンテキストや実行状態によって異なることだ。 記号の意味がコンテキストによって異なる例…
Ruby 1.9が採用しているVMの最適化手法に、Direct Threaded Codeというものがあるらしい。 YARV Maniacs #3 ターゲットコードが大きくなる代わりにVMの実行ループがかなり速くなるようだ。これを、Xslateに採用しない手はない、ということで簡単に実装してみ…
XslateがSmartyをサポートしたらいいのに、という要望があったので、Smartyを調べている。Smartyは極力「プログラミング」をできないようにしているようで、確かに使いやすそうだ。 調べてみるとcycle関数が面白そうなのでとりあえずXslateに似た機能を実装…
Test::LeakTraceは、主にXSコードのメモリリークを追うために書いたライブラリだが、誤検出(false positive)が多く使いにくかった。今回RTチケットを受け取ったのを機に、検出アルゴリズムを再考したので、誤検出はほぼなくなったはずだ*1。 新しいアルゴリ…
モジュールがエクスポートする関数を集めたい、と思うことがある*1。 すべてのモジュールがExporterを使っているなら、 @EXPORT_OK を見るだけでいいのだが、実際にはそうはいかない。しかたがないので、一旦他のパッケージにエクスポートし、その後コードリ…
(追記あり) Xslate 0.1033ではsort/mapにブロックを渡せるようになった。 <: $a.sort( -> $a, $b { $a.title cmp $b.title } ).join(", ") :> <: $a.map( -> $x { $x + 1 } ).join(", ") :>ところで[twitter:@xaicron] さんによれば、JavaScriptが使える端末向けの場合は、テンプレート</:></:>…
Xslate のエスケープポリシーについて考えたので、ここでまとめておく*1。 Xslate のエスケープ処理について、覚えることは以下の三つである 'none' のもとでは挙動が異なるが、これはメールなどの非HTMLテキストを出力するために用意されているモードであり…
Xslateが束縛(binding)をサポートし、値に名前をつけることができるようになった。ただしそれらは定数扱いであり、代入はできない。 <: # constantはベアワードを要求 constant LANG = "Xslate"; # myは変数名を要求 my $lang = "Perl"; -:> Hello, <: LANG :> world! Hello, <: $lang :> world!myで宣言した定数も、定数なので代入を禁止している。その代わり、コンパイル時に決定でき</:></:></:>…
Xslateが5.8.1でも動くようになりました。 また、makamakaさんの努力により、pure Perl版が高速になりました。Text::MicorTemplateを少し上回るスコアを出しています*1。 benchmark/others.pl $ XSLATE=pp perl -Mblib benchmark/others.pl Perl/5.10.1 i686…
Tsukuba.xs #1 Beer Talksですが、主催者が遅刻*1したりマック勢がプロジェクターへつながらなかったりといろいろハプニングはあったものの、無事終えることができました。 会場を提供していただいたリクルートさんありがとうございました! 無茶ぶりにも関…
先日Classic::Perlというモジュールで奇妙なモジュール終末値*1を見た。 # snip __THE__ => __END__ =head1 NAME この発想はなかった。=>演算子の左辺は裸のワードでよく、しかも演算子の右辺は省略できる)という構文が許される。,演算子から類推すると理解…
XSでメモリリークを避ける基本原則は、それほど難しくない。すなわち、作ったSV(およびSVファミリ)はすぐsv_2mortal()するのである。mortalなSVはスコープ*1から抜けるときに解放されるため、メモリリークは起こらない。つまり、あるスコープ内で新しく作っ…
Sartakが日本に来ているという事で、Perl/XSを話題にカンファレンスを行うことになりました。XS Niteに続いて二度目のXSオンリーの会です。楽しみですね!! 参加申し込みはATNDからどうぞ。 Tsukuba.xs Beer Talks #1 いつものShibuya.pmと違い、飲食物が出…
Xslateですが、pure Perlで動くようになりました。makamakaさんが一週間でやってくれました!複雑なXSコードを移植するのは大変だったと思います。ほんとありがとうございます。また、lestrratさんがttree(1)ライクなxslate(1)を作ってくれました。すばらし…
Xslateはいままで $SIG{__WARN__} = \&croak 相当のことをして、すべての警告で致命的エラーにしていた。しかし、これは非プログラマが使うには厳しすぎるということで、エラー制御のポリシーを変更することにした。 次のリリースでは以下のようにするつもり…
id:tokuhirom の助言を受けて、APIの見直しなどをした*1。 キャッシュディレクトリのデフォルトが、テンプレートファイルと同じディレクトリからFile::Spec->tmpdirへ。これはcache_dirオプションで変更もできる 一引数の render(\%vars) は混乱を招くため廃…
Xslateは実行エンジン・パーザ・コンパイラが独立になるように設計してあるため、コンパイル済みの仮想マシンコードを用意すればの実行の際にコンパイラをロードする必要がない。またこのため、パーザ部分だけを切り替えることも比較的簡単にできる。そこで…
Xslateにテンプレートの重ね掛け(template cascading)を実装した。 この機能は、DjangoやText::MicroTemplateのテンプレート継承に似ている。 使い方だが、まず基本となるテンプレートを用意し、block $name -> { ... }でブロックを定義する。 base.tx: <section> : b</section>…
OSDC.twでXslateを発表してきました。 発表資料:http://gfx.github.com/osdc-tw-2010/main/肝心の発表は、プレゼンの焦点がぶれてしまって*1イマイチな出来でした。ひたすらPerl/XSへの愛を語るほうが私らしくてよかったと思います。とはいえ、この旅行自体…
来週末、4/24に開催されるOSDC.TW(or Shibuya.pm #13)で発表します。そこでは、高速テンプレートエンジン Xslate を紹介するつもりです。これはまだコードを書き始めたばかりで完成には程遠いものの、すでに従来のテンプレートエンジンと比較すると数倍のパ…
Perl 5.12.0がリリースされたようです。おめでとうございます! http://search.cpan.org/dist/perl-5.12.0/
Text::ClearSilver(CS)のベンチマークをとってみた。 比較はTemplate-Toolkit(TT), HTML::Template::Pro(HT), Text::MicroTemplate(MT)、およびMobaSiF::Template(MST)と行った。ベンチマークスクリプトは id:tokuhirom のものをベースに少し複雑にした。 結…
id:Craftworks さんから仕事をもらいまして、ClearSilverのPerlバインディングを書きました。 http://search.cpan.org/dist/Text-ClearSilver/ git://github.com/Craftworks/Text-ClearSilver.git ClearSilver はCで実装されたテンプレートエンジンで、高速…
Test::Vars の解説を少しだけ。Perlの構文木を歩き回るには、B::walkoptree()かB::walkoptree_exec()を使う。基本的なやり方は以下の通りである。 #!perl -w use strict; use feature 'say'; use B; my $cv = B::svref_2object(sub{ $_[0] + 42 }); local *B…
未使用の変数があるかどうかテストするTest::Varsというモジュールを書いた。 http://github.com/gfx/Perl-Test-Vars http://search.cpan.org/dist/Test-Vars/ 使用感は以下のようになる。 $ perl -MTest::Vars -e 'vars_ok "Test::Builder";' # $pack is us…
Makefile.PLで開発者用のモジュールを宣言するにはM::I::AuthorRequiresがあるが、これはモジュールがインストールされていなければdieするので、結局は手作業でモジュールをインストールしなければならない。しかし、今やcpanmがあるので、「モジュールのリ…
[追記]その後deprecated(廃止予定)ではなくstrongly discouraged(強く非奨励)に状態が改められたが、使用すべきでないという点は変わらない。[/追記] bleadperlのコミットログを眺めていたところ,以下のような記述があった。 deprecate bytes.pm この件…
Mouse 0.51からエラーチェックをMooseと同じくらい厳しくする予定です。具体的には,以下の場面で警告や致命的エラーを出します。 has()に未知のオプションが渡されたとき警告 おそらく綴りミスであるため has()によってアクセサが生成されず,かつ is => 'b…
Perlの開発版である5.11系列の最新版がリリースされた。 http://search.cpan.org/dist/perl-5.11.5/ 今回もバグフィクス中心なので,特に列挙すべき新機能はない。組み込みファイルハンドルのクラスが修正されたのが唯一の大きな変更か。 5.11.5までは,組み…
Strict constructor, which will warn unknown (maybe misspelled) arguments, is as useful as the strict pragma. For Moose, there is an extention to provide strict constructor: MooseX::StrictConstructor. Now Mouse 0.50_02 supports strict const…