関数型言語の勉強にSICPを読もう - (24) 2章 - データによる抽象の構築 (98-107ページ)

問題2.68

(define (encode message tree)
  (if (null? message)
      '()
      (append (encode-symbol (car message) tree)
              (encode (cdr message) tree))))

(define (encode-symbol char tree)
  (define (list-have? l e)
    (cond ((null? l) #f)
          ((equal? (car l) e) #t)
          (else (list-have? (cdr l) e))))
  (if (leaf? tree)
      '()
      (cond ((list-have? (symbols (left-branch tree)) char)
             (cons 0 (encode-symbol char (left-branch tree))))
            ((list-have? (symbols (right-branch tree)) char)
             (cons 1 (encode-symbol char (right-branch tree))))
            (else (error "error")))))

(encode '(A D A B B C A) sample-tree)


うお。鳥肌が立った。
書いたコードが一発で動いた。しかもdecode前と一致しているし。
これは冷静に分析して少し力が付いたのではなかろうかと思ってしまうな。
プログラミングの楽しさの原点ってのは、書いたコードが思い通りに動くことだよなと再認識。


(list-have?)はひどいので解答を見てみようと思ったら見つからなかったのでこれで良しとしよう。

問題2.69-2.72

パスします。
このパスが原因でつまるようであれば戻ってこよう。

2.4 抽象データの多重表現

ここまでの話は全ては前フリだったのか。
キーワードは

  • type tag
  • 型による振り分け(dispatching on type)


やばいここはかなりおもしろすぎる
いろいろな言語を渡り歩いていたりとか学習する過程で自分の中にできていたふにゃふにゃの何かが実はこれだったのか的な。
うぉーーーーーーーーーーー。
これはやばい。
ドキドキがおさまらない。面白すぎる。(apply-hogehogeとか
練習問題を解く楽しみは明日。
この部分を読むためだけにもこの本は買う価値があると思う。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404