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

<>についての議論(p5p MLより)

perl5-porters[perl #2783]あたりから始まる<>についての議論を考えてみた。といってもp5pのスレッドはほとんど読んでないのでこの議論そのものがどういう流れになっているかは知らない(後で読む)。<>(引数を省略した行入力演算子)は@ARGVにファイル名が…

unread()のバグ

:scalar :scalarのunread()のバグについて,perlbugにレポートを送った。しかし添付ファイルを付け忘れた。 バグレポートは大分送り慣れてきたが,いつもファイルを添付するのを忘れてしまう。今回は,いつも添付し忘れるから本文にもファイル名を書いておこ…

LL Future

http://ll.jus.or.jp/2008/LL Future行きたい。しかしLTの受付は既に締め切っていた。残念…。

PerlIO_unread()

PerlIO_unread()という,stdioのungetc()を拡張したようなPerlIO APIがある。 PerlIO APIのテストの為に,これをPerlから呼び出すモジュールを書いて,ついでにCPANにアップロードした。 しかし,これはちょっと思慮の足りない行為だったかもしれない。Perl…

PerlIOの実装メモ#2 PerlIOで出来ること

そもそもPerlIOで何が出来るのか。 その理解のために,標準PerlIO(組み込み+標準ライブラリ)とPerlIO::Utilなどのレイヤについて機能別に分類してみた*1 リソースアクセス系 PerlIOはI/Oのためのシステムだから,何らかのリソースにアクセスするレイヤが常…

Ruby.pm が動かない理由

Rubyをブートするとき,あとでGCするためにスタックの位置を記録しているようだが,そのせいでSystemStackErrorになるらしい。1.8, 1.9ともに問題はこのことだと思われる。 use Ruby;のときのバックトレースを調べてみた。 main() perl_parse() S_parse_body…

openプラグマの落とし穴

openプラグマの挙動が異様だ。 以下のようなライブラリHoge.pmがあったとする。ライブラリファイルのエンコーディングはShift_JISとする。 package Hoge; sub hoge{ use Data::Dumper; my $hoge = "ほげ!"; printf "is_utf8: %d\n", utf8::is_utf8($hoge); …

Perlでiostream

C++のiostreamに憧れたことがある。 #include <iostream> #include <iomanip> int main(...){ std::cout << "int: " << 42 << std::endl; std::cout << "str(left) : [" << std::setw(10) << std::left << "hoge" << "]" << std::endl; std::cout << "str(right): [" << std::se</iomanip></iostream>…

Acme::StringFormat

Perl VMを拡張してStringFormat演算子を定義してみた。 http://search.cpan.org/dist/Acme::StringFormat/ RubyやPythonなどで組み込みStringクラスにStringFormat演算子"%"が定義されているのがうらやましくてやった。実装はなんでもよかった*1。今は反省し…

Ruby.pm for 1.9が動かない

ためしに1.9に対応させようとしたが,bootの段階でコケるので最小限のコードを切り出して試してみる。なんとか起動はするようになったがすぐSystemStackErrorが起きてろくに動かない。 無理やりSystemStackErrorを抑えても動かない。どこかで無限ループして…

順序付けされたハッシュリテラル(2)

http://d.hatena.ne.jp/gfx/20080713/1215918381についてNishinoさんとid:charsbarさんから同じコメントをいただきました。 Tie::IxHashやTie::LLHash,Tie::DxHashなどが順序付けされたハッシュの実装だそうです。 use 5.010; use Tie::IxHash; tie my %has…

*STDRRには不用意にレイヤを追加しないほうがいい

以下のコードは「done.」だけ出力して終了する*1。 #!perl -w use strict; binmode *STDERR, ':encoding(foo)'; print join(' ', PerlIO::get_layers(*STDERR)), "\n"; END{ print "done.\n"; } __END__ これはbinmode()がdieするためだが,本来なら,:encod…

順序付けされたハッシュリテラル(というアイデア)

こんなことが出来たらちょっとうれしい。 use hash 'indexed'; my $h = { foo => 42, bar => 43, baz => 44}; say join ' ', keys %{$h}; # 常に"foo bar baz"の順 技術的にはどうだろう。OPコードフィルタでがんばれば出来そうな気がするが。

OPコードフィルタで高速なアクセサ(というアイデア)

perl - no accessor; # だって遅いんだもん最近流行のPL_checkハックで,$o->fooを$o->{foo}に書き換えるOPコードフィルタを作れないものかと思った。 $ perl -MO=Concise -e '$o->foo' # これが 7 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;>…

PerlIO実装メモ#1 - デストラクタ

結論 PerlIOを実装するとき,リソースの開放はPopped()で行う。Close()を実装する必要はない。 解説 実装メモと称していきなりデストラクタの解説から入るのもどうかと思うが,PerlIOの実装にあたって突き当たる3番目の壁*1なので非常に重要である。 さて,P…

perlio.cの問題点のまとめ

perlio.c(v5.10.0)について,私が感じている問題をまとめてみた*1。明確なバグもいくつか見つけたが,それはきちんと報告することにする。したがってこのリストには載せていない。なお,以下でたびたび出てくるPerlIOBaseというのはレイヤに共通した機能を提…

PerlIO::code

Perlのopen()はファイル名に相当する引数がリファレンスだと特別扱いする。以下のようなことが出来るのはそのためだ。 my $scalar = 'foo'; open my $fh, '<', \$scalar; print <$fh>; # => "foo" これはスカラーリファレンスに対してPerlIO::scalarを自動的…

Extend PerlIO and PerlIO::scalar

PerlIOが不完全だということは一応認知されているらしい。perltodoに以下のような記述がある PerlIO::scalar doesn't know how to truncate(). Implementing this would require extending the PerlIO vtable. Similarly the PerlIO vtable doesn't know abo…

Ruby.pm 0.05

Linuxでもテストが通るようになった。しかしスタックが足りなくなるのは結局解決方法が分からない。というか,そもそも「スタックが足りない」とか「スタックを拡張する」というのがどういうことなのか分からない。Rubyの拡張モジュールもロードできないまま…