Scheme手習い Chapter 7
気付きとか
- 集合の例として出ているものについて(p.113)
- eq?をequal?使って書き直したっけ?
- p.113とp.115でmember?とかmultirember?の定義をequal?使って書き直したって記述があるんだけど記憶になかった orz
- 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で補助関数を使った定義と使わない定義を見比べると超違う
- 使わないとき
- 前章でも表現から部分を取り出す補助関数を定義して抽象化してた。(1st-sub-exp, operatorなど)
(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の戒律
表現から抽象化するに際し、補助関数を使用すべし。
はめっちゃ大事ですね。
今までの章で書いたのも補助関数を使うと読み易くなるのだろうか。