2008年12月31日水曜日

【実践CL】5 関数


  • 前説

    • 「Lispの関数も、他の言語における関数と同じように、機能(functionality)を抽象化する基本的な仕組みを提供してくれるものだ。」加えて、データの抽象化という観点も重要に思える。

  • 5.1 新しい関数の定義

    • 要旨:defunの要素の一通りの説明。

  • 5.2 関数のパラメータリスト

    • 要旨:CLのパラメータリストは多機能。それによってプログラミングは随分楽になっている。
    • 要旨:常に入力が必要な変数は必須パラメータで書く。

  • 5.3 オプショナルパラメータ

    • 要旨:入力が必要じゃないときもある変数はオプショナルパラメータで書く。

  • 5.4 レストパラメータ

    • 要旨:可変個の入力を受け入れたいときはレストパラメータで書く。

  • 5.5 キーワードパラメータ

    • 要旨:パラメータが複数あって、入力時にそれらそれぞれを与えるかどうかが混沌としてる場合はキーワードパラメータで書く。

  • 5.6 異なる種類のパラメータの併用

    • 要旨:4種類使うなら、必須、オプショナル、レスト、キーワードの順。
    • 要旨:オプショナルとキーワードは同時に使うな。

  • 5.7 関数の戻り値

    • 要旨:defunが関数名でblockを用意してくれているので、return-from 関数名で関数の処理から脱出できる。

  • 5.8 データとしての関数または高階関数

    • 「関数をデータで扱える」というのはいくつかの意味を持っていると思う。まずファーストクラスとして扱えること、次に関数の記述自体がリストであること。

  • 5.9 無名関数

    • lambdaフォームは関数名の場所につかえるリストにすぎない。そして名前の変わりにその振舞を直接示している。
    • lambdaがマクロでもある、とHyperSpecにもあるが、これはちょっと理解しがたい。(lambda -> (function (lambda だとしたら、マクロ展開したときに無限ループになっちゃうのでは? CLtL1の解釈「funcallとかevalは、lambdaが冒頭のリストフォームを特別視する」でいいんじゃないかなぁ。
    • syntax sugar って構文糖でいいのかな? 構文糖衣が多数じゃないか?


前半は速めに進んで、後半の実践の章でまったりしたい。こつこつ。

0 件のコメント: