2007年02月21日(Wed) 歯医者日和 [長年日記]
● ずんこの歯のチェックに行ったらちょうど空いてるので僕のクリーニングもやろうということになった。以前と同じくCCDでレントゲン写真を撮ったあと、今回の新兵器は歯のための超音波洗浄器。前回針金でごりごりやってもらったよりは痛みが少なかったような気がするよ。
● [run] 最短コース 3.14マイル 26分23秒
MSG中毒のため今日は食べるのを控えていたのだけれど、その影響か、走りはじめには左腹が、後半には右腹が痛くなった。呼吸器系リミットはまだ続いているが回復しつつはあるかな。
● [tDiary] 後日談プラグインのバグの修正
miasaka_mさんにお知らせいただいた複数の月の後日談を期待通り表示できないバグをrev 1.8で修正しました。そのほか、CSSのインデントをきれいにしました。お使いの方は更新をお願いします。ご報告をいただきありがとうございました。
● 「実践『JavaからRubyへ』〜血があつい鉄道ならば/走りぬけてゆく汽車はいつかは心臓を通るだろう〜(Internal Edit.)」 (角谷HTML化計画)
あとで見る!ぜったい!
● 今日の継続
やっとわかったこと。 下記のようなコードで、Bの行で継続をcallして戻る先はAの行ではなくてCの行。 callccに与えられたブロックの後に行くようだ。 もちろん、以下のコードでは、 Bの行をコメントアウトしてもそのままCの行に進む。
これを念頭に置いてokujiさんのコードを読むと、2回目以降のadvanceは下記(okujiさんのコードより抜粋して註釈を加えた)のように進むことがわかる。
(3)から(4)へのジャンプは継続によるもので、 次に(4)から(5)に行く過程で内部イテレータがひとつ進んでいる。 さらに、(7)から(8)へのジャンプは継続によるもので、 (7)でcallに与えられた引数が(1)ではじまるブロックの返り値となる。
つまり、@outerの継続で内部イテレータのブロック引数を外にとりだしていて、 次のadvanceで内部イテレータに戻るために@innerの継続を利用してるわけですね。
なるほどぉ。
しかしまだわからないこと。なぜ(3)から(4)に行く過程で、 内部イテレータの状態が元に戻ってしまわないのか? 「状態をすべて保存する」という意味での継続だと戻らなくちゃいけないような気がするのだけれど、それじゃあいつまでたってもイテレータは進んでいかないし、そもそも継続を使う意味がないような気もする。 ということは、RubyならRubyで、継続を使いやすいように、継続で戻される状態と戻されない状態が決められてる、ということなんだろうか…。夜も眠れなくなりそうだ(おい)
というわけでそろそろ寝ます。
RubyのContinuationはCのsetjmp/longjmp風インターフェースなので、Schemeと違って、返り方が少し分かりにくいですよね。callccがreturnするところに返ると言えば分かりやすいですか。<br><br>ところで、内部イテレータの状態はちゃんと戻ってますよ。進んだ状態を保存して、そこに戻っているので、進んでいるだけです。
最近のツッコまれどころ