『Scheme手習い』読書会 第12回

Scheme手習い』読書会の12回目です。範囲としては8章途中(P135)〜8章終わり(P149)です。

収集子が難しいです。関数の戻り値が収集子の戻り値になってしまうため、繰り返しの処理が難しくなってしまいます。ざっと見たところ、この章以降出てこないようなので、ここで覚えてしまいたいですね。

  • 8章 究極のlambda(続き)
    • 関数valueの定義:補助関数atom-to-functionを定義して使用。
    • 関数mutirember-fの定義:前回同様比較関数test?を引数に取る。
    • 関数multiremberTの定義:比較関数test?を取るのではなく、test?自体に削除対象の値を持たせる。(lambda (test? a lat)) から (lambda (test? lat))に変更。
    • 関数multirember&coの定義:収集子colを引数に取る。「col」は「collector」の短縮形。continuation(継続)とも呼ばれるらしい。
    • 収集子を呼び出す収集子を定義して、次の再帰呼び出しを行うという繰り返し。
    • 関数の戻り値が収集子の戻り値になるため、再帰部分に工夫が必要になる。
    • 収集子を使うことで、同時に2つ以上の値を集めることができる。
    • 関数multiinsertLRの定義:特に難しくない。insertL,insertRを合わせた関数。
    • 関数multiinsertLR&coの定義:収集子を返すため、関数の戻り値をconsするのではなく、収集子を定義するlambdaの内側でconsする点に注意する。
    • 関数evens-only*の定義:特に難しくない。奇数を取り除いたリストを返す関数。*なのでそれを考慮した再帰呼び出しを行う。
    • 関数evens-only*&coの定義:最後の(cons (evens-only* (car l)) (evens-only* (cdr l)))だった箇所がややこしい。収集子の中にevens-only*&coの呼び出しと集計を行うロジックを含めておく。評価される順番をよく考える。(最後の答えは誤り 28->38)

追記:『Scheme手習い』読書会 第13回