TheSeasonedSchemer (4)

今更ながらどうもこの本はこーゆー形ではなくて、ホワイトボードがある所で喧喧諤諤しながら読んだ方が良さげな気がしてきています。

この章、確かに長くはあるのですが、非常に示唆に富んでるというかなかなか面白いです。

  • 第15の戒律
  • if がようやく出てきた

あと、継続との組み合わせで以下な let というか begin の使い方は成程、と言うしかないッスね。

(define leftmost
  (lambda (l)
    (letcc skip
      (letrec
        ((lm (lambda (l)
               (cond ((null? l) '())
                     ((atom? (car l)) (skip (car l)))
                     (else
                       (let ()
                         (lm (car l))
                         (lm (cdr l))))))))
        (lm l)))))

最後の let の中の最初の lm の呼び出しで skip した場合はそのまま終了。逆に '() が戻った場合は次の lm 呼び出しに制御が移る、と。
これに似たソレが try で (try x a b) は実際には以下とのこと。

(letcc success
  (letcc x
    (success a))
  b)

最初、直感的に理解できなくて困りました。

  • a の中で x な継続を使うと内側の letcc から抜けて b を呼び出す
  • a が x という継続を使わずに終わったら success という継続を使って外側の letcc から抜ける

すげー。
でも最後らへんで晩メシに遅れるから、と言ってこのあたりを巻いちゃったのは非常に残念だったりしてますw