2008-01-01から1年間の記事一覧

PPIの簡単な使い方

PPIはなんだかとっつきにくかったが,使ってみると意外といける。パースするコードは読まなくても,PDOM(Perl Document Object Model)が分かればとりあえず使うことができる。 ppidump.pl さて,まず実際にPPI使う前に,ダンプユーティリティを用意しておく…

LL Future行ってきた

Larry Wallにサインしてもらった。 『プログラミングPerl』は重くて嫌だったので,『初めてのPerl 第二版』に。この序文が傑作なのに,第三版には載っていない。残念。

LL Future

明日のLL Future行きます。Larry Wallを一目だけでも!

macro.pm

PerlVMを直接いじるのは大変だが,PPIとソースフィルタを使えば比較的簡単にPerlを拡張できるかもしれない,と思ってモジュールを書いてみた。 macro - An implementation of macro processor このmacro.pmはcpp(1)に似たマクロを提供する。 use macro add =…

PerlIO実装メモ#3 PerlIOレイヤのデータ構造

PerlIOのデータ構造は以下の通り。 typedef struct _PerlIO PerlIOl; typedef struct _PerlIO_funcs PerlIO_funcs; typedef PerlIOl* PerlIO; struct _PerlIO { PerlIOl* next; /* Lower layer */ PerlIO_funcs* tab; /* Functions for this layer */ U32 fl…

PerlIOのメモリアロケーション

PerlIOのデータ構造の前に。 CレベルのPerlIO*については、PerlIOシステムがメモリ管理をしてくれる。そのメモリ管理を行うのがPerlIO_allocate()で、これが呼び出されると利用していないPerlIO*ポインタを探して返す。利用されていないPerlIO*ポインタがな…

no indirect; / no indirect ':fatal';

間接オブジェクト構文で警告を出したり致命的エラーを出したりするプラグマ。おなじみのPL_checkハックで実装されている。 以下のようなありがちな実行時エラーをコンパイルエラーに変えることができる。 use Test::More tests => 2; use Foo; no indirect '…

PERL_NO_GET_CONTEXT

XSモジュールを書くときはPERL_NO_GET_CONTEXTを試してみるといいようだ。 perlgutsによれば,perlのビルド時にPERL_IMPLICIT_CONTEXTが指定されているとき,PERL_NO_GET_CONTEXTマクロをperlヘッダの#includeの前に定義すると効率がよくなる,とある。この…

open()の改良

Perlのopen()をマスターするのは大変だ。perldoc perlfuncのopenの項はすさまじい長さだし,perldoc perlopentutというopenのチュートリアルも,単なるチュートリアルなにものすごく長い。しかもPerlIOという機能のおかげでopen()そのものも自由に拡張できる…

Ruby.pm実装メモ#0 目次(予定)

6月にRuby.pmについての発表を2度した。それはそれで完結はしたのだが,時間が経つことでいろいろ考えがまとまったこともあるので,補足記事をいつか書きたい。いつか。 CライブラリとしてのRuby Rubyのメソッド呼び出し

PerlIO実装メモ#0 目次

デストラクタ PerlIOで出来ること PerlIOレイヤのデータ構造 PerlIOのメモリアロケーション PerlIOメソッド俯瞰 コンストラクタ/イニシャライザ PerlIO::scalarを読む 順番はいずれ整える。 9月になるとしばらく忙しくなるだろうから,8月中には書ければいい…

<>についての議論(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の拡張モジュールもロードできないまま…