さて、いよいよ後半になって難しくなってきた。
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でくるんで渡して後続の計算から呼び出されるところとか
クロージャで前の計算の値を保持してるとことか
0 件のコメント:
コメントを投稿