タグ

ブックマーク / gfx.hatenadiary.org (4)

  • Pure PerlによるPerl5 Virtual Machineの実装 - Islands in the byte stream (legacy)

    Perl VMの気持ちを知るには、PurePerlで実装してみるとよい。 コード例(PerlVM.pmのコードは記事の末尾にある): #!perl -w use strict; use PerlVM; my $x = shift || 42; PerlVM::call_sv(sub{ print "Hello,", " world!", "\n"; if($x){ print $x, " is true\n"; } else{ print $x, " is false\n"; } }); __END__ 実行結果: $ perl hello.pl Hello, world! 42 is trueむろん、PerlVM::call_sv()の中で引数を呼び出したりはしていない。 Hello, world!くらいならPerlVMの中身も比較的単純だ。そのメカニズムはBモジュールに依存している。B

    Pure PerlによるPerl5 Virtual Machineの実装 - Islands in the byte stream (legacy)
  • FieldHashの使い道 - Islands in the byte stream (legacy)

    FieldHashを使ったInside-Outクラスあれこれの続き。 結局のところ,FieldHashによるInside-Outクラスはハッシュリファレンスを用いたものより遅い。しかしそれにもかかわらず,FieldHashが非常に有効なケースがある。それは,Mixinクラスを作るときに来のオブジェクトの実装に影響を与えずにプロパティを設定したいときである。 たとえば,DBIx::Classで使われているClass::Accessor::Grouped(v0.08002)には以下のような箇所がある: sub get_inherited { my $class; if (Scalar::Util::blessed $_[0]) { my $reftype = Scalar::Util::reftype $_[0]; $class = ref $_[0]; if ($reftype eq 'H

    FieldHashの使い道 - Islands in the byte stream (legacy)
  • strict無効化の誤謬 - Islands in the byte stream (legacy)

    シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ my($class, $property) = @_; no strict 'refs'; # simple read-only accessor *{$class. '::' . $property} = sub{ my($self) = @_; return $self->{$property}; } } このようなコードによって生成されたメソッドを,正しくオブジェクトに対して使う分には問題ない。しかし,このメソッドをクラスメソッドとして呼び出すと,グローバル変数${$self}を参照し,その値をハッシ

    strict無効化の誤謬 - Islands in the byte stream (legacy)
  • Perl Quiz - package名について - Islands in the byte stream (legacy)

    Q.以下のテストケースが失敗するようなf()を書いてください。ただし,ライブラリを使用してはいけません。回答は一週間後くらいに。 #!perl -w use strict; use Test::More 'no_plan'; sub f{ # 何かする } f(); is ref(bless({}, 'Foo')), 'Foo'; __END__ sv_derived_from()を刻んでいるうちに見つけたちょっと変な挙動です。 2008/10/08 追記 (現トラックバック数:7) 皆さん解答ありがとうございます!意外なやり方もいくつかあって驚きました。 あとで詳しく紹介&解説したいのですが,今は定期演奏会やら学祭やらで忙しいので,また後ほど。

    Perl Quiz - package名について - Islands in the byte stream (legacy)
  • 1