継続

能無しな僕ですが、かの有名なSICPを読んでみたいと思い、Schemeを勉強してます。
んで、その準備にと"The Little Schemer"を読んでます。これも名著。
終わったら"The Seasoned Schemer"に進むつもり。


8章のmultirember&co関数あたりで難易度が上がってるような気がする...。

(define multirember&co
  (lambda (a lat col)
    (cond
      ((null? lat) (col (quote ()) (quote ())))
      ((eq? (car lat) a) (multirember&co a (cdr lat)
                                         (lambda (newlat seen)
                                           (col newlat (cons (car lat) seen)))))
      (else (multirember&co a (cdr lat)
                            (lambda (newlat seen)
                              (col (cons (car lat) newlat) seen)))))))

ってな定義なんですが、

(define a-friend
  (lambda (x y)
    (null? y)))

なる関数をcolとして用いて、つまり

(multirember&co 'tuna '(strawberries tuna and swordfish) a-friend)

を評価すると、結果はtrueだと。


まず、戻り値がtrueかfalse(aが見つかったか否か)なのに、何故に"multirember&co"なる関数名なのか疑問。
multirember&co関数って、colとして与える関数によっていろんな意味になりえるよなー。たぶん。
名前なんて何でも良かったのかな。


一行ずつトレースしていけばなんとか動きは分かるけど、書けって言われても絶対無理っす。
慣れるしかないのかなぁ。
「multirember&co」を検索ワードにしてググってみたら、multirember&coみたいなのを「継続渡しスタイル」というらしい。
継続を理解するのは難しい、といたるところで耳にしていたので、とうとう来たかー、って感じ。


あぁ、SICPは遠い...。