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

Scheme手習い』読書会の11回目です。範囲としては8章頭(P126)〜8章途中(P135)です。

今日は、友人と時間が合わないため一人での読書会です。

8章はどうやら高階関数を主題にしているようですね。せっかくの関数型言語ですから、高階関数をバリバリ使っていきたいですね。

  • 8章 究極のlambda
    • eq?やequal?を関数の引数に渡すことができる。
    • 関数rember-fの定義:eq?を使用していた比較部分を引数test?として受け取る。
    • 関数eq?-cの定義:関数を返す関数である。
    • 関数eq?-saladの定義:eq?-cを使用して定義する。
    • 関数rember-fの再定義:test?を取り、関数を返す形に修正する。
    • 関数rember-eq?の定義:rember-fとeq?を使用して定義する。
    • 無名関数の使用。関数rember-eq?は、名前を付けなくても使用できる。( (rember-f test?) a l)
    • 関数insertL-f,insertR-fの定義:insertL,insertRをtest?を取る形に修正する。練習。
    • 関数insert-gの定義:insertL,insertRの違いを補助関数により吸収し、補助関数を引数に取るようにすることで汎用化する。
    • 補助関数seqL,seqRの定義:左側に追加する(insertL)か、右側に追加する(insertR)かの違い。
    • seqL,seqRは定義せず、そのまま渡しても良い。(lambda (new old l) (cons new (cons old l)))。
    • 関数substの定義:insert-gで手軽に定義。補助関数としてseqSを定義(しなくても作成可能)。
    • 関数remberの定義:insert-gを使用して定義。insert-gはリストを走査し、一致した要素を操作する関数なので汎用性が高い。

今日はこのあたりまでで良いでしょう。10ページほどしか進んでいませんが、内容としては比較的濃いと思います。続きはまた明日。

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