Scheme手習い Chapter 7

気付きとか

  • 集合の例として出ているものについて(p.113)
    • (apple peaches apple plum)や(apples peaches pears plums)などリストの中の要素に複数形のものがある。
    • set?がどんな関数か考えさせるために複数形の名詞を入れてるのかなぁ(複数形の名詞だからといってsetなわけではないみたいな)
  • eq?をequal?使って書き直したっけ?
    • p.113とp.115でmember?とかmultirember?の定義をequal?使って書き直したって記述があるんだけど記憶になかった orz
  • makesetのテストケースについて
    • 最初のmakesetの定義だと結果はp.114の最初の質問の答え(apple peach pear plum lemon)と同じ結果にならない。
    • 最初のmakesetの定義だと結果はp.114の最後の質問の答え(pear plum apple lemon peach)になる。
    • 第2のmakesetの定義だとその逆で、最初の質問の答えになるが、最後の質問の答えと同じ結果にならない。
    • とりあえず最後の定義で通るように修正。
  • subset?の2つ目の質問でandと5の間にスペースがあいてないのは間違いかな? (p.115)
  • intersect?の定義のところで、最初の質問の答えが#fじゃなくてnilになってるのが所々ある。間違い?
  • p120のfirst, secondの定義では引数がp(pair)、p121のthirdの定義だとl(list)。引数の名前付けも中身に対応してて分かりやすい。
  • 集合とか、そこらへんの数学出てくるとお手上げ。
    • 情報数学入門でも読むか… orz
  • fullfun?を、最初
(define fullfun?
  (lambda (fun)
    (and (set? (firsts fun))
         (set? (seconds fun)))))

と書いたんだけど、funが渡されてくる前提があるから最初の質問はいらなかった。

感想

  • 前に定義した関数を使って簡潔に書ける
    • makesetでmultirember
    • eqset?の中のsubset?
    • intersectallの中でintersect
  • 表現から部分を取り出す補助関数first, second, buildを使ってすっきり書ける
    • 前章でも表現から部分を取り出す補助関数を定義して抽象化してた。(1st-sub-exp, operatorなど)
      • 読み易くなって変更にも強い!
    • revrelで補助関数を使った定義と使わない定義を見比べると超違う
      • 使わないとき
(define revrel
  (lambda (rel)
    (cond ((null? rel) '())
          (else (cons (cons (car (cdr (car rel)))
                            (cons (car (car rel))
                                  '()))
                      (revrel (cdr rel)))))))
      • build, first, second使うと
(define revrel
  (lambda (rel)
    (cond ((null? rel) '())
          (else (cons (build (second (car rel))
                             (first (car rel)))
                      (revrel (cdr rel)))))))
      • 更にrevpairを使うとすっきり
(define revrel
  (lambda (rel)
    (cond ((null? rel) '())
          (else (cons (revpair (car rel))
                      (revrel (cdr rel)))))))
  • fullfun?も
    • (set? (seconds fun))か(fun? (revrel fun))で。

なんというか一行文の補助関数がある/なしで大分読み易さが違うなって印象でした。
前章でも出てきた第8の戒律

表現から抽象化するに際し、補助関数を使用すべし。

はめっちゃ大事ですね。
今までの章で書いたのも補助関数を使うと読み易くなるのだろうか。