Scheme修行13章

letcc - /var/log/messages
フライングされていたので早速13章を読みました。1度読んで2度目読む前にプログラミングGaucheの継続の章を斜め読みしたらちょっとすっきりしました。
その後バスの中でもう一度読んでソースコード書きながら読んで、再度メモを確認しつつ軽く読んだのでエントリを書きます。

letccについて

call-with-current-continuation、その略のcall/cc、継続の事です。
Scheme 修行 - /var/log/messages
を参考にgaucheのマニュアルのletccの項目Gauche ユーザリファレンス: 手続きと継続を読むと
(let/cc var body…)が(call/cc (lambda (var) body …))に展開されると書いてあります。
なのでlet/ccを使うことにしました。

メモ書き

  • (hop M)に遭遇する前にすべきことだった事を全て忘れて(letcc hop M)の値を求めたかのように振る舞う
  • (letcc hop ( (hop)を呼び出すまでの色々な手続き ) M)の色々な手続きを全部忘れてMのところまでジャンプすると考えちゃってもいいのかな
  • hopと唱えて、結果と一緒に正しい場所へ
  • 第14の戒律「(letcc ...)を用いて、値を直ちに、すばやく返すべし。」
  • どこかで覚えてた計算を忘れる
  • intersectallとrember-upto-lastで違うとこ
    • intersectallは結果が何かを知っている
    • rember-upto-lastはリストの部分が結果に「ない」か知っている
      • リストの中にaを見つけたら、リストの残りに結果がある。前の部分には「ない」。
  • consが結果を待ってるはずなのにconsしないでskipしてたり色々と面白い。
  • 結果をまたずに抜け出すとき、必要のない部分を捨てるときに使うと便利っぽい
    • 計算途中だった値はどこへいっちゃうんだろ
  • 継続についてはもうちょっと別の本やウェブサイト読まないと完全には理解出来てなさそうな感じがする

間違いかな?と思ったもの

  • p45の(null? (cdr lset))の質問の答えは真じゃないかな?
  • p49とp50のJの中のcondのmember?とelse?の結果の式は反対じゃないかな。

感想

再帰がどんなに深くても一番最初のとこまで戻って来れる! すごい!
継続はもっと色々な使い方が出来そうなのでScheme修行読んだらプログラミングGauche読んで再度勉強したい。

そういえば「再起」関数のtypoオーム社さんのTwitterアカウントにmention飛ばしたんだけど返事が帰ってきてないので後でちゃんと窓口から連絡しようと思います。