Scheme 手習い 7 章

今日は linaro な kernel をだらだら見ようかな、って思っていたら @hanachin_ の中のヒトからエントリ投入の報せが入った。

そろそろ真面目にヤらないとシャレにならないはずなので真面目に確認着手。

とりあえず

git pull して diff 見てみるか。いっちゃんてっぺんの commit が dfb5e59f でこの章の最初の commit が 13d42219 で良いのかな。ちがうのかな。その前から、という形でないと駄目なのかな。377c3253 でヤッてみれば良いのか。

makeset

最初の makeset は

gosh> (define lat '(apple peach pear peach plum apple lemon peach))
gosh> (makeset lat)

(pear plum apple lemon peach) が戻るな。
二つ目の makeset は (apple peach pear plum lemon) が戻る。
これ、makeset1 とか makeset2 とかにして挙動の違いを確認した方が良さげ。

むむ

これ、初見だ。違うかな、忘れてるだけなのかな。

(define subset?
  (lambda (set1 set2)
    (cond ((null? set1) #t)
          ((member? (car set1) set2) (subset? (cdr set1) set2))
          (else #f))))

これを and 使って簡潔に書ける模様。

(define subset?
  (lambda (set1 set2)
    (cond ((null? set1) #t)
          (else
           (and (member? (car set1) set2) (subset? (cdr set1) set2))))))

てか、@hanachin_ のエントリ見てると本文の記述なデバッグしてますな。
以下、気づきを列挙しときます。

  • 117p の intersect? な定義は確かに nil 戻してるんですが述語ですよね
  • それ言っちゃうと 116p のてっぺんの subset? も t 戻してるし
  • subset? と intersect? の比較は非常に興味深いですね
    • intersect? は一つでも equal? だったら OK なんですが、subset? は set1 の atom が全部 set2 に存在しないと NG という違いに依る模様
  • 脳内 eval で読むと scheme ウサギ飛び状態かもw
  • revpair あっての revrel は確かに読みやすいですね

以前定義された手続きの定義を見に行ったり来たりは結構キツい。あと、@hanachin_ の中の人のエントリにもありますが、revrel な手続き定義の可読性はいっちゃん最後のソレが一番良いですね。素晴しいなぁ。