2009-02-01から1ヶ月間の記事一覧

Lexical::Types by VPIT

Vincent Pit氏のLexical::Typesがなんだかすごい。 SYNOPSISより: { package Str; sub TYPEDSCALAR { Some::String::Implementation->new } } use Lexical::Types; my Str $x; # $x is now a Some::String::Implementation object もともとPerlには"my Class…

use Smart::Comment;

引数の名前を知る方法 Data::Dumper::Names Perl Hacksで紹介されていたSmart::Commentsもいい感じです。 #!perl -w use strict; use Smart::Comments; sub f{ my($foo, $bar, $baz) = @_; ### $foo ### $bar } f(42, ['xyzzy']); __END__ 結果: ### $foo: 4…

open local(*FILEHANDLE)とB::Deparse

IO::scalarでIOのキャプチャは一行でできる気がしたのでやってみる。 { open local(*STDIN), '<', \"Hello, world!\n"; print <STDIN>; # => Hello, world! } print scalar <STDIN>; これでうまくいった。しかし,local()の括弧をはずすとPrecedence problemという警告が出</stdin></stdin>…

Test::Synopsis

SYNOPSISの構文を自動でチェックするというアイデアをid:miyagawaさんがモジュールにしてくれました。 http://search.cpan.org/dist/Test-Synopsis/ ファイルを探すのにExtUtils::Manifestを使っているのがクールですね!あとこのreturnの使い方に仰天: ret…

SYNOPSISの構文を自動でチェックする

新しいモジュールの使い方を調べるときに真っ先に目を通すのがPODのSYNOPSISセクションである。特に,英語が母語ではないPerlerにとってはPODの中で最も重要なセクションといっても過言ではない。それだけに,自らモジュールを書くときは細心の注意を払う。 …

IO::scalarでIOのキャプチャ

STDIN/STDOUTを使うテスト IO::ScalarArray 標準入力の自動試験標準モジュールのIO::scalarでもIOキャプチャできますよ。 Tieによるモジュールと機能はほぼ同じです。 #!perl -w use strict; { my $content = "Hello, world\n"; open my $in, '<', \$content…

Test::LeakTraceのnot_leaked()

Test::LeakTrace 0.02でnot_leaked()がそこそこまともに動くようになった。与えられるブロックを一度実行した後にトレースするようにしたので,内部でキャッシュを使うシステムを考慮したうえで検証してくれる。たとえばClass::Monadic 0.01を用いたコード:…

Test::LeakTraceをCPANにあげた

Test::LeakTraceというアイデアを形にした。 http://search.cpan.org/dist/Test-LeakTrace/ 使用例: #!perl -w # example/leaked.pl use strict; use Test::LeakTrace; use Data::Dumper; my @refs = leaked_refs{ my %a; my %b; $a{b} = \%b; $b{a} = \%a;…

Test::LeakTraceの実装を考える

Test::LeakTraceを実装するために,Devel::LeakTrace::Fastのメカニズムを考えてみた。Devel::LeakTrace::Fastの関数名を眺めて考えただけなので,実際の実装とは異なる可能性がある。 Devel::LeakTrace::FastがしていることはSV Arena*1を走査してある区間…

Test::LeakTraceというアイデア

Devel::LeakTrace(::Fast)?が使いにくい。BEGIN/ENDでレポートを出力するだけだし,そのレポートもSVの型とアドレスしか報告しない。それでもないよりはマシなので,Devel::LeakTraceを呼び出すスクリプトをauthor/やmisc/などに入れて実行しているが,これ…

既存の特異メソッドモジュール

Perlで特異メソッドでは「標準モジュールにも特異メソッドを実現するものはない」と書いたが,そういえばPerl 5.10.0から標準モジュールになったObject::Accessorというものがあることを思い出した。これは直接特異メソッドを定義するのではないが,振る舞い…

『モダンPerl入門』のXSの章がすばらしすぎて吹いた

『モダンPerl入門』を軽く立ち読みしてきた。主にXSの章を中心に読んできたのだが,これがすばらしい。私がXSに触れ始めたころは英語をほとんど読めなかったので,XSの習得にはものすごく苦労したのだった。perlxstutのサンプルコードを試したり,Perlのソー…

Perlで特異メソッド

Ruby界隈ではあたりまえのように使われる特異メソッド*1だが,Perlでは組み込みでのサポートはなく,標準モジュールにも特異メソッドを実現するものはない。Class::MOP/Mooseの匿名クラスが似た用途を持っている*2が,オブジェクトの実装型に制約がある。た…

Class::Method::Modifiers::Fastのバグ

Class::Method::Modifiers::FastのバグはてっきりRoleが継承ではなくサブルーチンのコピーで機能の拡張をしていることが原因だと思ったのだが,よく検討してみるとMouseのバグのような気がしてきた。 以下のようにすると問題は起きない*1。 Index: lib/Mouse…

Roleと抽象クラスの違い

Moose/MouseのRoleはMix-inのようなものらしいが,抽象クラスをMix-inするのと違ってそのロールクラスを継承ツリーに組み込むのではなく,シンボルとメタ情報をそのロールクラスを使用するクラスにコピーする点がMix-inと異なる,という理解でいいんだろうか…

Class::Method::Modifiers::Fast

XSで実装しなおしたClass::Method::Modifiers::FastをCodeReposにあげました。しかし,Mouse::Roleと一緒に使うと余計なクラスにまで修飾子が付いてしまうというバグ*1は直ってません。 理由は分かっているので近いうちに直します。 *1:http://rt.cpan.org/P…

Devel::MROとExtUtils::Depends

少し前にXSからmro関数をポータブルに使えるようにするためのDevel::MROというモジュールを書いた。そこそこ用途はあるようで,chocolateboy氏*1から「ExtUtils::Depends使ったほうがいいんじゃない?」といわれたので使ってみた。 ExtUtils::DependsはExtUt…

Data::UtilのModifiersのPure Perl実装

Data::UtilはPure Perlの実装があるのだが,Perl 5.8ではmodify_subroutine()の実装はHash::Util::FieldHash::Compatに依存しており,H::U::F::CはVariable::Magicに依存しており,V::Mのビルドにはコンパイラが必要だと気づいた。つまり,Perl 5.8ではコン…

Perl Magicは意外と簡単に使える

PerlのC APIにはMagicという考え方があって,任意のSVにフックとプライベートデータを付けることができる。このAPIはXSからでも利用できるのだが,難しそうで敬遠していた。しかし,試してみると意外と簡単に使えることが分かったのでメモしておく WeakRef::…

FieldHashの使い道

FieldHashを使ったInside-Outクラスあれこれの続き。 結局のところ,FieldHashによるInside-Outクラスはハッシュリファレンスを用いたものより遅い。しかしそれにもかかわらず,FieldHashが非常に有効なケースがある。それは,Mixinクラスを作るときに本来の…

FieldHashを使ったInside-Outクラスあれこれ

Hash::Util::FieldHashを使うとInside-Outクラスを簡単に作ることができる。といっても,これはクラスビルダーではないのであくまでも「何も使わずにクラスを書くのと同じくらい簡単に」という程度でしかないが。 # Book.pm package Book; use strict; use H…