土曜の記録を火曜に書くってのはいかがなものか。 とりあえず、全般的な記録は RWiki からどうぞ。
今回は対象範囲が短いわりに興味深い論点が多くありました。
個人的に一番面白かったのは $SAFE の話かな。 あのあともうちょい考えたんですが、確かに今の $SAFE の仕様は変です。 すんごく単純に考えると、 $SAFE=1 では tainted なオブジェクトは多いほどよいはずです。 一方 $SAFE=4 では tainted なオブジェクトは少ないほどよいはずです。 これは明らかに矛盾している。
ちなみに $SAFE=4 の理想的な姿はどうかと言うと、 (今の仕様で言う) tainted オブジェクトがない状態から始めて 公開してもよいオブジェクトだけを taint し、$SAFE=4 に入るのがベストでしょう。
それからまた別の話題で、正規表現の名前付きキャプチャ。 いまは括弧にマッチした部分は $1, $2... のように番号でしか取れないけど、 それを名前で取りたいという話です。 akr さんはローカル変数に代入されるのがベストだという意見でした。 こんな感じかな?
if /xxx(?k=foo:....)xxx(?k=bar:....)/ =~ str p foo # マッチすると代入されている p bar end
正規表現中の文法は議論を覚えてないので今でっちあげました。 なお、この機能は正規表現リテラルを直接書いた場合だけ働き、 埋め込み式 #{....} がある場合も機能しません。
一方、ぼくの意見はこんなんです。 あくまで現在の延長線上でしかない仕様ですね。
if m = /xxx(?k=foo:....)xxx(?k=bar:....)/.match(str) foo, bar = *m.select(:foo, :bar) p foo p bar end
あっ、そうだ、Binding を明示的に渡すというのはどうだろう!
if /xxx(?k=foo:....)xxx(?k=bar:....)/.match(str, binding()) p foo p bar end
先生、とても組み込みライブラリの仕様には見えません!
ああ、あとそれから、POOS (Plain Old Open Source) っていうネタもあったなあ。
酒井さんから「代数」について学ぶ会。
さらにそのあと、終電のなくなった酒井さんにつきあって 笹田さんの研究室にお邪魔してきました。 メンバーは笹田さん・酒井さん・shelarcy さん・青木。
いやあ……
いろんな意味で濃かった。
(21:11)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
正規表現リテラルの場合だけ機能するということで満足するかしないか、という選択の問題だと思います。
飛び入りしますが、正規表現リテラルを「プログラムコードの一部」とみるか、組み込みであっても外部のオブジェクトと見るかの差とも言えるかも。正規表現リテラルがfirst class objectとして扱われていないなら、わざわざ正規表現オブジェクトを作成するまでもなく、正規表現のマッチコードを自体を周囲のコードのコンパイル結果に埋め込んでしまう、という選択肢が考えられるわけで。そういう文脈で考えればレキシカルにマッチ結果が束縛されるのは自然ですね。
読書会では Regexp は、String を受け取ってマッチ可能かどうかを真偽値を返しつつ、
副作用としてキャプチャした部分文字列をローカル変数に代入するクロージャである、
という考え方を述べました。
(もちろんマッチオブジェクトを $~ に代入すると言う副作用もあっていいわけです)
言いませんでしたが、この考え方を押し進めると、
Regexp A の中に #{} で Regexp B を埋め込むのは、
特殊な関数呼び出しであって、そうだとすれば
B 内のキャプチャは B がリテラルとして記述されたスコープにおけるローカル変数への代入になるのが自然であるとも考えられます。
Schemer的には、副作用よりは束縛の導入にしたくなります。こんな感じ:
(with-regexp #/(?k=foo:...)(?k=bar:...)/
... ;; ここでfoo, barが束縛されている
)
ただ、これだと別の箇所で出てきたregexp Bを埋め込むってところのセマンティクスが難しいかなあ。
いずれにせよ、これはおもしろそうなんで、ちょっといじくってみようと思います。
問題は first class な pattern はどうあるべきかってところですかね。
なんか、いかにも論文がありそうな感じ。