2011年6月29日水曜日

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でくるんで渡して後続の計算から呼び出されるところとか


クロージャで前の計算の値を保持してるとことか





0 件のコメント:

コメントを投稿