2008-09-01から1ヶ月間の記事一覧

Acme::Don't 2.0!

Acme::Don'tというモジュールがある。これが提供するdon't{}は,Perl組み込みのdo{}とは逆に,ブロックの中身を実行しない。たとえば以下のコードのように使う*1。 use Acme::Don't; don't{ print "Hello, world!\n"; # => 実行されない }; これは問題ない。…

instanceof演算子(2)

Perlのinstanceof演算子のベストプラクティスは何か Cygwinで試すとref_evalよりscalar_utilが遅かったんですが一般的にはそうでもないようです。 Linux/Perl 5.8.5で試してみると確かにref_evalよりscalar_utilのほうが早い傾向にあります。 For Foo=HASH(0…

instanceof演算子

Perlにinstanceof演算子があればいいのにと思うことがたまにある。 $xがオブジェクトで,$classのインスタンスであれば真を返す演算子だ。 既存のコードではなかなか一発でできない。 $x->isa($class); # (1) ref($x) && eval{ $x->isa($class} }; # (2) Sca…

Perlの最適化器

perlgutsとperlhackによれば,Perlの最適化は3段階あるらしい。 check routines context propagation peephole optimization 今までやってきたPL_checkによるカスタマイズはこのcheck routinesフェイズのことだったようだ。 check routinesはOPコードの生成…

warnings::unused

warnings::unused 宣言しただけで使ってない変数があると警告するプラグマを書いた。 目的としてはPerl::Critic::Policy::Variables::ProhibitUnusedVariablesと同じ。 warnings::methodと同じく,わざわざ別コマンドを走らせる必要はないうえ,実行速度にも…

macro.pm v0.04

以前のmacro.pmではマクロをdo{ ... }で囲んで展開していたのだが,マクロの中身が+(...)に展開できそうなときは+(...)に展開するように最適化したらだいぶ速くなった。 以下はperl v5.8.5 built for i386-linux-thread-multiで計った結果。 $ perl -Mblib e…

Language::P - Perl5によるPerl5の実装

http://search.cpan.org/dist/Language-P/なんだか面白そうだ。あとで読もう。

feature::compat

warnings::compatがあるのだから,feature::compatもあっていいのではないかと思う。 しかし,say()は簡単に実装できるが,switch()とstate()はソースフィルタが必要だし,あまり実用的ではないか。

warnings::lint

コンパイル後のOP treeを見て小言を言ってくれるモジュールとしては既にB::Lintというものがあるわけだが,どうせ大したチェックをしてくれるわけでもないので,いちいちperl -MO=Lint script.plなんてしていられない。 しかし,warnings::lintというプラグ…

OP_GVの実際の型

warnings::methodがスレッドのない環境で動かなかったのは,OP_GVの型がUSE_ITHREADSの有無で変わるからだった。 /* op.c as of 5.10.0 */ OP * Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv) { dVAR; assert(gv); #ifdef USE_ITHREADS GvIN_PAD_on(gv);…

warnings::methodのメカニズム

warnings::method なぜかスレッドが無効になっている環境ではテストが通らないようだが,とりあえず公開した。 さてメカニズムだが,まずどんなOPコードが生成されるのかを目視したうえで,どのようにOPコードツリーを走査するのか考える。 $ perl -MO=Conci…

macro.pm v0.03

macro.pmはv0.03になってわりとうまく動くようになった(と思う)。ためしにHTML::FillInForm::Liteでいくつかの関数をマクロ化してベンチマークをとったところ,約20%ほど高速になった。それなりに効果はあるようだ。 ちなみに,マクロの書き方はサブルーチ…

:method attributeの有効活用

サブルーチンに付けられる:methodアトリビュートは,メソッドを定義するときに付加することで,同名の組み込み関数を呼び出すときの"Ambiguous call"警告を避けることができる。 #!perl -w sub length :method{ 1 } # 以下の文は:methodがないと"Ambiguous c…

PPIの簡単な使い方

PPIはなんだかとっつきにくかったが,使ってみると意外といける。パースするコードは読まなくても,PDOM(Perl Document Object Model)が分かればとりあえず使うことができる。 ppidump.pl さて,まず実際にPPI使う前に,ダンプユーティリティを用意しておく…

LL Future行ってきた

Larry Wallにサインしてもらった。 『プログラミングPerl』は重くて嫌だったので,『初めてのPerl 第二版』に。この序文が傑作なのに,第三版には載っていない。残念。