Scheme手習い Chapter 8

さて、いよいよ後半になって難しくなってきた。
8章ではカリー化、収集子(継続とも呼ばれる)、収集子を渡すスタイルの関数の書き方。
第10の掟「同時に2つ以上の値を集める際には関数を作るべし。」が出てきた。

自分なりまとめ

  • 関数はリストとアトムを返せる
    • 関数自身を返す事も出来る
      • これは関数が第一級オブジェクトだから?
      • 第一級ってどんな事かっていうと
        • 関数を引数にとれる
        • 関数を変数に代入出来る
        • 関数に名前をつける必要がない
      • よく聞く関数が第一級市民というのはWikipedia見ると『この言葉は1960年代にChristopher Stracheyによって「functions as first-class citizens」という文脈で初めて使われた。』らしいのでそれから来てるのかな。
  • カリー化
    • 『カリー化 (currying) とは、計算機科学分野の技法の一つ。複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。』(Wikipediaより)

気付きとか

  • func.scmが700行越えてきて見通し悪い
    • なんか前もこんな事書いた気がする
      • 1章1ファイルにまとめるとすっきりしそう
      • テストも1つのファイルにまとめられたりするかな?
  • insertR-fとinsertL-fの内側のlambdaの引数の名前
    • insertRやinsertLのときは(new old lat)だったのが(new old l)になってる。
    • コピペでinsertR-fとinsertL-fを作ったのでlatのままにしてたのに気付き、後から修正 orz
    • test?を取るのでlat以外の構造も比較出来る。だからlatじゃなくてl、なのかな?
    • 引数の名前付けって大事っすね…
    • でもinsert-gだとeq?で比較してるのにlだ。latじゃないのかな…謎。
  • 前に定義した関数を定義しなおした時ってテストどうしよ
    • とりあえず1.scmから順番に全部通るのを確認してみてる
  • こないだ作ったf-testマクロの都合で関数を返す関数のテストが出来ないかも
  • 無名関数を渡すようにすると覚えておく名前が少なくてすむ(p135)便利!
  • 関数を取って関数を返す関数は怖くない!
  • multirember&coみたいに、名前に&がつくのには、最後に?がつくのは述語!のように決まりがあるのだろうか
  • 継続渡しスタイル面白い!
  • even?の定義
    • 自分で作ったo+ o* o/を使わずにSchemeに元からある+ * /を使って定義すると奇数でも#tになるので注意。
  • p148のevens-only*&coの結果は間違ってるらしい
  • evens-only*&coは一応書けた。やっぱり一番最後の収集子が難しい。
    • 一応かけたけど何をしてるかって聞かれるとまだ説明しづらい。

感想

収集子面白い!
lambdaでくるんで渡して後続の計算から呼び出されるところとか
クロージャで前の計算の値を保持してるとことか