Gauche > Archives > 2011/03/14

2011/03/14 00:25:06 UTC(び)
#
うは
2011/03/14 00:26:47 UTCshiro
#
今git bisect中です。
2011/03/14 00:49:46 UTCshiro
#
犯人は d6f23ad1 Snapshot commit of pass4 optimization かな。git bisect便利だ。gitにした甲斐があった。
2011/03/14 05:13:56 UTCshiro
#
パッチは分かったが影響がでかすぎて切り分けが大変。とりあえず「インラインされる特定の手続きが、通常のトップレベル毎のコンパイルでは正常にインライン展開されるけど、precompによるバッチコンパイルではちゃんとインライン展開されない」というところまではわかった。
2011/03/14 08:14:15 UTCshiro
#
わかった。(define (foo) (let ([x (lambda () #f)]) ...)) のような式で、内側のlambdaは外部の環境を参照していない。0.9.1までのコンパイラはこういう場合でもlambda式が評価される度に新たなクロージャを生成していたが、trunkではこういう何度評価しても全く同じ動作をするlambda式については一度だけクロージャを作って共有するようになった。
#
Schemeの仕様上、手続き同士はその動作が同じであれば区別することは出来ないので、この変換は正当である。ところがコンパイラ内部では、インライン情報など手続きに余分なプロパティをつけていて、今回はプレースホルダとして作っていたダミー手続きが意図せず共有されてしまったために違いが出た。
2011/03/14 08:23:01 UTC(び)
#
なるほど...
2011/03/14 08:25:15 UTCshiro
#
しかしこんなのを意図的にテストするようなテストケースってどう書いたら良いんだろうなあ。今回はたまたまext/内で引っかかるのがあって見つけてもらってラッキーだったけど、Gauche本体のコンパイルで問題が出て無かったらかなり厄介だったろうなあ。
2011/03/14 11:54:15 UTCshiro
#
(ref <list> <symbol>) というメソッドを定義しておけばペアpに対して (~ p'car) とか (~ p'cdr)とか書けるんだな。これだけだと嬉しくないけど、その先にクラスがぶら下がってると (~ p'car'foo) 等と書けてこれは (~ (car p)'foo) より見やすいことがある、かもしれない、かな、どうだろ。
2011/03/14 13:08:42 UTC齊藤
#
それならいっそ (ref <top> <procedure>) とでもしてしまえばいいのでは。
2011/03/14 13:45:40 UTCshiro
#
それもあって良いけどちょっと使い方が違ってくるなあ。(~ p car'foo) になるから。まあ文字数変わらないから一緒ってば一緒なんだけど。
#
あ、あとhashtableはprocedureをキーにしてる可能性があるからぶつかるか。
2011/03/14 14:33:27 UTCshiro
#
gitになったからってんで気軽にブランチ作ってみてるけど、自分自身があっちやこっちで仕事するためにはすっかりローカルなリポジトリじゃなくてあっちやこっちから見えてるところにブランチを置きたい。でも作業中のスナップショットとかをメインのリポジトリにpushするのも気が引ける。git的には自分用の作業リポジトリをどっかサーバに立てるのがいいのかな。