perl

Template Toolkit sucks

Template Toolkitはどういうわけか*1Perlにおける標準のテンプレートエンジンの座にいるが、その仕様は美しいとは言い難い。特にまずいのは、 あるトークンの意味がコンテキストや実行状態によって異なることだ。 記号の意味がコンテキストによって異なる例…

Xslate with Direct Threaded Code

Ruby 1.9が採用しているVMの最適化手法に、Direct Threaded Codeというものがあるらしい。 YARV Maniacs #3 ターゲットコードが大きくなる代わりにVMの実行ループがかなり速くなるようだ。これを、Xslateに採用しない手はない、ということで簡単に実装してみ…

Smartyを調べている

XslateがSmartyをサポートしたらいいのに、という要望があったので、Smartyを調べている。Smartyは極力「プログラミング」をできないようにしているようで、確かに使いやすそうだ。 調べてみるとcycle関数が面白そうなのでとりあえずXslateに似た機能を実装…

Test::LeakTrace has been improved at 0.11

Test::LeakTraceは、主にXSコードのメモリリークを追うために書いたライブラリだが、誤検出(false positive)が多く使いにくかった。今回RTチケットを受け取ったのを機に、検出アルゴリズムを再考したので、誤検出はほぼなくなったはずだ*1。 新しいアルゴリ…

How to collect exportable functions

モジュールがエクスポートする関数を集めたい、と思うことがある*1。 すべてのモジュールがExporterを使っているなら、 @EXPORT_OK を見るだけでいいのだが、実際にはそうはいかない。しかたがないので、一旦他のパッケージにエクスポートし、その後コードリ…

Xslate vs. JSON::XS

(追記あり) Xslate 0.1033ではsort/mapにブロックを渡せるようになった。 <: $a.sort( -> $a, $b { $a.title cmp $b.title } ).join(", ") :> <: $a.map( -> $x { $x + 1 } ).join(", ") :>ところで[twitter:@xaicron] さんによれば、JavaScriptが使える端末向けの場合は、テンプレート</:></:>…

How and when Xslate escapes html special characters

Xslate のエスケープポリシーについて考えたので、ここでまとめておく*1。 Xslate のエスケープ処理について、覚えることは以下の三つである 'none' のもとでは挙動が異なるが、これはメールなどの非HTMLテキストを出力するために用意されているモードであり…

Xslate supports binding

Xslateが束縛(binding)をサポートし、値に名前をつけることができるようになった。ただしそれらは定数扱いであり、代入はできない。 <: # constantはベアワードを要求 constant LANG = "Xslate"; # myは変数名を要求 my $lang = "Perl"; -:> Hello, <: LANG :> world! Hello, <: $lang :> world!myで宣言した定数も、定数なので代入を禁止している。その代わり、コンパイル時に決定でき</:></:></:>…

Xslate 0.1025 works on 5.8.1

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 無事終了!

Tsukuba.xs #1 Beer Talksですが、主催者が遅刻*1したりマック勢がプロジェクターへつながらなかったりといろいろハプニングはあったものの、無事終えることができました。 会場を提供していただいたリクルートさんありがとうございました! 無茶ぶりにも関…

Crazy module end markers

先日Classic::Perlというモジュールで奇妙なモジュール終末値*1を見た。 # snip __THE__ => __END__ =head1 NAME この発想はなかった。=>演算子の左辺は裸のワードでよく、しかも演算子の右辺は省略できる)という構文が許される。,演算子から類推すると理解…

XSでメモリークを避けるたった一つの方法

XSでメモリリークを避ける基本原則は、それほど難しくない。すなわち、作ったSV(およびSVファミリ)はすぐsv_2mortal()するのである。mortalなSVはスコープ*1から抜けるときに解放されるため、メモリリークは起こらない。つまり、あるスコープ内で新しく作っ…

Tsukuba.xs Beer Talks #1 を開催します!

Sartakが日本に来ているという事で、Perl/XSを話題にカンファレンスを行うことになりました。XS Niteに続いて二度目のXSオンリーの会です。楽しみですね!! 参加申し込みはATNDからどうぞ。 Tsukuba.xs Beer Talks #1 いつものShibuya.pmと違い、飲食物が出…

Xslate now work without C compilers

Xslateですが、pure Perlで動くようになりました。makamakaさんが一週間でやってくれました!複雑なXSコードを移植するのは大変だったと思います。ほんとありがとうございます。また、lestrratさんがttree(1)ライクなxslate(1)を作ってくれました。すばらし…

Xslate error handling policy will be changed

Xslateはいままで $SIG{__WARN__} = \&croak 相当のことをして、すべての警告で致命的エラーにしていた。しかし、これは非プログラマが使うには厳しすぎるということで、エラー制御のポリシーを変更することにした。 次のリリースでは以下のようにするつもり…

Xslate, as of 0.1009

id:tokuhirom の助言を受けて、APIの見直しなどをした*1。 キャッシュディレクトリのデフォルトが、テンプレートファイルと同じディレクトリからFile::Spec->tmpdirへ。これはcache_dirオプションで変更もできる 一引数の render(\%vars) は混乱を招くため廃…

Xslate, as of 0.1006

Xslateは実行エンジン・パーザ・コンパイラが独立になるように設計してあるため、コンパイル済みの仮想マシンコードを用意すればの実行の際にコンパイラをロードする必要がない。またこのため、パーザ部分だけを切り替えることも比較的簡単にできる。そこで…

Template cascading in Xslate

Xslateにテンプレートの重ね掛け(template cascading)を実装した。 この機能は、DjangoやText::MicroTemplateのテンプレート継承に似ている。 使い方だが、まず基本となるテンプレートを用意し、block $name -> { ... }でブロックを定義する。 base.tx: <section> : b</section>…

OSDC.twで発表してきました。

OSDC.twでXslateを発表してきました。 発表資料:http://gfx.github.com/osdc-tw-2010/main/肝心の発表は、プレゼンの焦点がぶれてしまって*1イマイチな出来でした。ひたすらPerl/XSへの愛を語るほうが私らしくてよかったと思います。とはいえ、この旅行自体…

OSDC.TWで発表します

来週末、4/24に開催されるOSDC.TW(or Shibuya.pm #13)で発表します。そこでは、高速テンプレートエンジン Xslate を紹介するつもりです。これはまだコードを書き始めたばかりで完成には程遠いものの、すでに従来のテンプレートエンジンと比較すると数倍のパ…

Perl 5.12.0 released!

Perl 5.12.0がリリースされたようです。おめでとうございます! http://search.cpan.org/dist/perl-5.12.0/

Benchmarks to Text::ClearSilver

Text::ClearSilver(CS)のベンチマークをとってみた。 比較はTemplate-Toolkit(TT), HTML::Template::Pro(HT), Text::MicroTemplate(MT)、およびMobaSiF::Template(MST)と行った。ベンチマークスクリプトは id:tokuhirom のものをベースに少し複雑にした。 結…

Text::ClearSilver - New ClearSilver binding in Perl

id:Craftworks さんから仕事をもらいまして、ClearSilverのPerlバインディングを書きました。 http://search.cpan.org/dist/Text-ClearSilver/ git://github.com/Craftworks/Text-ClearSilver.git ClearSilver はCで実装されたテンプレートエンジンで、高速…

Visit opcode tree with B

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 to detect unused variables

未使用の変数があるかどうかテストする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…

Install developper's prerequisites with cpanm

Makefile.PLで開発者用のモジュールを宣言するにはM::I::AuthorRequiresがあるが、これはモジュールがインストールされていなければdieするので、結局は手作業でモジュールをインストールしなければならない。しかし、今やcpanmがあるので、「モジュールのリ…

bytes.pm will be deprecated in Perl 5.12

[追記]その後deprecated(廃止予定)ではなくstrongly discouraged(強く非奨励)に状態が改められたが、使用すべきでないという点は変わらない。[/追記] bleadperlのコミットログを眺めていたところ,以下のような記述があった。 deprecate bytes.pm この件…

Mouse will become as strict as Moose

Mouse 0.51からエラーチェックをMooseと同じくらい厳しくする予定です。具体的には,以下の場面で警告や致命的エラーを出します。 has()に未知のオプションが渡されたとき警告 おそらく綴りミスであるため has()によってアクセサが生成されず,かつ is => 'b…

Perl 5.11.5 features

Perlの開発版である5.11系列の最新版がリリースされた。 http://search.cpan.org/dist/perl-5.11.5/ 今回もバグフィクス中心なので,特に列挙すべき新機能はない。組み込みファイルハンドルのクラスが修正されたのが唯一の大きな変更か。 5.11.5までは,組み…

Strict constructor is available in Mouse

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…