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

XSとPuerPerlの二つの実装を持つモジュールの書き方

XSとPurePerl(PP)両方の実装を持つモジュールは少なくない。たとえば: Data::Dumper List::Util/Scalar::Util (List-Scalar-Utils) List::MoreUtils Class::MOP Params::Util (>=0.35) Params::Validate Data::Util DBI JSON/JSON::XS Text::CSV/Text::CSV:…

Shika - Yet another class builder

要はMooseっぽい記法でプロパティ*1を定義できるクラスビルダーで、__PACKAGE__とかいらないのでClass::Accessorより簡単らしいよ。id:tokuhiromに呼ばれたのでXSコード書きます。そういうわけで、希望としては効率よりも可読性重視でよろしく。ところで、mr…

Shibuya.pm #10

LTで発表してきました。充実した半日でした!Acme::Don'tのソースコードあります。 資料はまた後ほど。

自分が書いたコードの品質を説明しなければならないとき

たとえば、新機能を提供するパッチを送るときなどに、どうやってコードの品質を説明したらいいんだろうか。今まではそういうことは少なかったけど、最近そういう機会が時々あるので、そろそろ考えておいたほうがよさそうだ。 既存のテストが通るか(既存のテ…

Fast Method Modifiers

Data::Util 0.29_01にcurry()とwrap_subroutine()*1,subroutine_modifier()*2を追加して,そのデモとしてData::Util::MethodModifiersを実装したよ! #!perl -w use strict; { package Foo; use Data::Util::MethodModifiers; before foo => sub{ print "be…

「パッチの拒否率をさげる10の方法」に照らして

Class::MOPのパッチを報告した後で,そういえばどこかにパッチを送る際の注意点を読んだな,ということを思い出した。 パッチの拒否率をさげる10の方法 (id:tokuhirom) チェックしてみると… svn HEAD でパッチをつくる -> △ CPANの最新版との差分にした 作者…

Class::MOP::Method::WrappedのXS化

コメントによれば,Class::MOP::Method::Wrapped->add_around_modifier()も最適化の候補らしいので,今XSで書いてます。 今のところサブルーチンの生成で50%以上,実行でも20-50%ほど高速化できた。ところが!PerlMagicを駆使したコードなのでメンテナンス性…

Class::MOP::Class->get_method_map()の挙動が不安定な件

get_method_map()は基本的にサブルーチンスタブ(宣言のみで実体なし)を拾わないようになっているんだけど,実際にはプログラムの状態によってスタブを拾ったり拾わなかったりと安定しない*1。特に,Devel::Coverの元で動かすとこの「拾ったり拾わなかったり…

Shibuya.pm #10行きます

id:TAKESAKOさんのご好意でShibuya.pm #10に行けることになりました。 ありがとうございます!!!というわけで,LTで話します。内容はAcme::Don't 2.0について。Acme::Don't 2.0はPerlの構文木を走査するコードなんですが,これが生まれたのはそもそも,前…

Class::MOP::Class->get_method_map()のXS版

Class::MOP::Class->get_method_map()書きました。add_method()は入れてません。 ベンチマーク(5.8.9 on linux, without threads, -DDEBUGGING): Initialization: Rate pp xs pp 2595/s -- -18% xs 3169/s 22% -- Looking into the stash: Rate pp xs pp 219…

Shibuya.pm #10行きたい(けど行けない)

Shibuya.pm行きたいなー。 Acme::Don't 2.0 - Bで覗くPerlの深淵 warnings::unused, warnings::method, indirect - コードの品質をチェックしながらプログラムを実行する XSを書くときの覚書 すぐにでも用意できるネタはこのくらいか。 でもお金がないから行…

Class::MOP::Class->add_method()のXS版のベンチマーク

Class::MOP::Class->add_method()のXS版のベンチマーク Perl/5.8.9 on linux, Class::MOP/0.7 Benchmark for add_method() For method object Rate pp xs pp 20096/s -- -17% xs 24093/s 20% -- For code reference Rate xs pp xs 5239/s -- -58% pp 12444/s…

Class::MOP::Class->add_method()のXS版

昨日XSで書くといったのはget_method_map()だったんだけど,ちょっとした勘違いでadd_method()をXSで書いてしまった…。せっかくだからあとでRTで報告しよっと。オリジナルと異なるのは,add_package_symbol()を呼ばずにサブルーチンをインストールしている*1…

Mooseのボトルネック

Mooseの速度改善の一助になればと思ってData::Utiを書いているのが,最近だいぶ機能が増えてきた。 今のところ,Params::Util+Sub::Identify+Sub::Install+Sub::Delete+Data::OptList+αという感じ。全て基本はXSで,コンパイラの無い環境のためのPurePerl実…

パッケージ名についてP5Pに投稿した件の覚書

パッケージ名の一貫性を求む!について。少し時間があったのでどうしても気になっていたことをP5Pに投稿した。…のだけど,いくつかの論点があったのだけどあまり整理し切れないまま投稿してしまったので整理しておく。論点は以下の3つ。 PerlQuiz - package…

perl 5.8.9 RC1

perl 5.8.9 RC1がきた。 しかし… $ ~/bin/perl -MO=Deparse,-p -e 'foreach my $a(1){}' foreach my($a) (1) { (); } -e syntax OKそういえばこのバグは報告してなかった。他にも報告したいことが数個あるけどこの段階ではもう無理かなあ。 いずれにせよレポ…

Lambda Expressions

Acme::Lambda::Expr わーいラムダが簡単に書けるよー\(^o^)/ *1 use feature 'say'; use Acme::Lambda::Expr qw(:all); my $f = abs($x - $y) ** 2; say $f->(10, 5); # => 25 $f = curry $f, 5, $x; say $f->(12); # abs(5 - 12) ** 2 = 49 まさにナン…

「Xのリファレンスかどうか」の判定

Xのリファレンスかどうかの判定はどう考えればいいんだろう。とりあえず配列リファレンスで考えてみる。 まず,基本的な考え方は以下の4つだと思う。 use Scalar::Util qw(reftype); ref($x) eq 'ARRAY'; # 1 reftype($x) eq 'ARRAY'; # 2 ref($x) eq 'ARRAY…