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

Class::MOPベースのオブジェクトではカプセル化を実現できない?

Class::MOPに基づくインスタンスMOPでは以下のようなメソッドを提供しなければならないんだけど… package Class::MOP::Instance; #... sub set_slot_value { my ($self, $instance, $slot_name, $value) = @_; $instance->{$slot_name} = $value; } #... こ…

曖昧なメソッド呼び出し

{ package Foo; sub foo{} } { package Bar; sub foo{} } { package Baz; use parent -norequire => qw(Foo Bar); } Baz->foo(); # Ambiguous! こんなときのBaz->foo()はメソッド解決順序(MRO)に依存している曖昧なメソッド呼び出しです。 C++だと,このよう…

use Data::Util -fast_isa; の詳細

(2008/11/16 追記: perl/5.10.1からUNIVERSAL::isa()が改善されることに伴い,Data::Util/0.20から-fast_isaオプションは削除されました)昨日の続き。UNIVERSAL::isaとData::Util::fast_isaで何が違うのかというと,核心部分のソースはこんな感じ。細部はと…

Data::Util (Scalar::Util::Refから改名+α)

Data::Util こんな汎用的な名前を付けてしまっていいのだろうかと思いつつリリース。sv_derived_from()はもっと高速に実装できるはず,というアイデアを取り込んでみました*1。 use Data::Utilするときに-fast_isaオプションをつけると,UNIVERSAL::isaを高…

Module::Setup (2)

Module::Setupの追記。 yappo もうちょっと詳しく教えてもらったら、なんかできるかもしれませんわざわざコメントありがとうございます。 module-setup Fooなどとしたときに,ディストリビューションディレクトリの直下にFoo.xsを作ったりしたいんですが,そ…

PerlでAssert

Perl5.9の時点では,assersionsと-Aコマンドラインスイッチという仕組みでCのassert(3)のようなことができるようになるはずだったらしい。しかし,そのメカニズムはPerl5.10には結局採用されなかった。 開発中はassert()が欲しい,しかし,リリース後の実行…

parrot 0.8.0 released

parrot-0.8.0 /NEWSうーん…面白そうだけどどこから何を読み始めればいいやら。

Module::Starter -> Module::Setup

モジュール作成にModule::Setupを使うようにしたらすごく便利になった! なんですが、テンプレート変数が物足りないので結局$template_varsにひとつ追加して使ってます。もしかしてテンプレート内で関数が呼べたりするのかなあ。Template-Toolkitを使ったこ…

Mooseが速いわけ

Mooseは起動に異様に時間はかかるし,クラス階層が複雑でどこから読み始めたらいいのかわからなかったのですが,使い始めるとなるほどこれはすばらしい。しかも,実行速度についてはかなり高速なんですね*1。 なぜ速いのかは追いきれてませんが,Memoizeした…

InsideOutテクニック

Perl Best Practices(PBP)でも紹介されていた,Inside-Outテクニックというものがあります。オブジェクトの完全なカプセル化が目的なわけですよ。以下,基本的な実装を示します。 # Foo.pm package Foo; use strict; use Scalar::Util qw(refaddr); my %bar_…

Perl Quiz - 解説

解答一覧(敬称略) ${^ENCODING}を使う by yappo - いきなりドン引き *is = \&isnt; by miyagawa *CORE::GLOBAL::ref/pp.cへパッチを当てる - by tokuhirom testルーチンの書き換え by wakapon - miyagawa氏のと同タイプ package ::Foo by mattn - この解答が…

Perl Quizに答えてみる

Perl Quizの出題者として一つくらいは新奇な解答を出さなければと思ってがんばってみるがなかなか難しい!とりあえずoverload::constant()に相当するコードを書けば何とかなるか,と思って試すもうまくいかない。 そこで更にコードをいじり倒していると…やっ…

Perl Quiz - package名について

Q.以下のテストケースが失敗するようなf()を書いてください。ただし,ライブラリを使用してはいけません。回答は一週間後くらいに。 #!perl -w use strict; use Test::More 'no_plan'; sub f{ # 何かする } f(); is ref(bless({}, 'Foo')), 'Foo'; __END__ s…

sv_derived_from()

5.10.0のsv_derived_from()(&UNIVERSAL::isaの実体)はもっと高速に実装できそうな気がする。 …と思って試してみると,確かに約3倍ほど速くなった。しかし,試したperlは-DDEBUGGING付きでConfigureしてあるうえ,プラットフォームがCygwinなのでこの数字は当…

Scalar::Util::Ref

instanceof演算子を実装してみた。 Scalar::Util::Ref #!perl use strict; use IO::File; use instanceof; my $x = IO::File->new(); if($x << 'IO::Handle'){ print "$x is an instance of 'IO::Handle'\n"; } __END__ Scalar::Util::blessed()&isa()と比べ…