2007年02月24日(Sat) 飛行機飛ばしまくり [長年日記]
● そういえば海軍の飛行機(4発のプロペラ機)もtouch&goの練習をしてたよ。
● Rubyの継続の返り値と帰り先
人間は一度止めた作業を再開するのにけっこうコストがかかると思う。 それはともかく。
そろそろリファレンスマニュアルに書いてあることが理解できるかもしれないと思って見てみた。
曰くcallcc()は
- ブロックの返り値を返す、が、
- Continuation#call()が呼ばれた時はcallの引数を返す
なるほど。前回わかったように、 okujiさんのコードでは二番目の仕様を利用して内部イテレータの引数を 外部イテレータに渡してましたよね。
okujiさんにツッコんでいただいたcallccがreturnするところに帰るというのは、上の1項目の仕様だと思うのですが、下記のようなコードを実行してみるとよくわかりました。
最初はcalccのブロックの値がputsで表示され、putsの後の Continuation#callが呼ばれると、callccが再び callの引数に与えた値を返しています。 なお、Continuation#callに引数を与えなかった場合は、返り値はnilに なっていました。
● Rubyの継続では何が保存されるか
本題。きっと今日中には理解できないと思うけれど。リファレンスマニュアルでは、calccを呼ぶ「直前の状態(ローカル変数の定義、スタックフレーム)を」記憶する、とありました。
まず、ブロックのなかで変えたローカル変数がどう扱われるかみてみ たいような気がします。
あれ。最初の一行は「good morning」かと思ったんだけどな。下記の 場合は、callccを呼ぶ直前のsの状態に戻るのなら、ぜんぶ「good morning」かと思ったのですが、そうではありませんでした。
うーん…。
継続なだけに、続く。
最近のツッコまれどころ