Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-01-01

Practical Common Lisp (18)

| 13:37 | Practical Common Lisp (18) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (18) - わだばLisperになる

やっとこさPractical Common Lisp 第5章5. Functionsです。この章も文字だけみたいなので、読んでメモするという感じで…。

5. Functions

  • 文法と意味論の後は、Lispの3つの基本要素である、関数、変数、マクロをみてゆく。
  • 3章で既にこれら3つは使用していたが、うわべだけでどのように機能しているかの詳細には立ち入らなかった。
  • 今後の2、3章で、これらの話題を扱う。他の言語で対応する諸機能と対象させて考察してみたり等々…。
  • Lispの大半は、関数で成り立っていて、言語規格で定められたものの3/4は関数が占める。
  • すべての組込みデータ型は、関数がどのようにデータを扱うかということにより定められている(?)
  • CLOSでさえ、関数/総称関数の上に成り立っている。これらは、16章で扱う。
  • Lisp流儀にはマクロというものが非常に重要なものになるが、すべての真の機能性は関数によってもたらされているものである。

Defining New Functions

  • 通常関数定義にはDEFUNが用いられ下記のように書かれる
(defun name (parameter*)
  "Optional documentation string."
  body-form*)
  • どんなシンボルでも関数名に使える。通常、アルファベットとハイフンのみが多い。それ以外は特定の命名規則に則って使用されることが多い。
  • 例えば、ある形式のものを他の形式に変換するような関数の場合、"-"で連結されて一つの名前になることがある。文字列をウィジェットに変換する場合は、string-widgetといった風。
  • 重要な事項としては、2章でも述べたが、語句の連結に、"-"を使いアンダースコアや、キャメルケースで書くことはしないということで、frob-widgetは、frob_widgetや、frobWidgetより好ましい。
  • 関数の引数リスト部は変数がどのように関数に渡されるかを定義する。引数を取らない場合は、空リストの()で表記される。
  • 引数の取り方の指定は、色々ある。必須とされるもの、オプション扱いのもの、複数の指定、キーワードの指定。
  • 引数のパラメータリストの次が文字列の場合、その文字列は、その関数を説明に使われるドキュメント文字列となる。関数が定義された場合、ドキュメント文字列は、DOCUMENTATIONで参照できるように定義される。
  • 最後に関数の主となる定義部分である本体になる。式は順に評価され末尾で評価された式が関数の値となるか、RETURN-FROMを用いて指定した値で関数を脱出することもできる。
  • 2章で記のような関数定義をしたが、これを詳細にみると下記のようになる。
    1. 関数の名前:hello-world
    2. 引数:()リストなので、引数はとらないことがわかる
    3. ドキュメント文字列はなし
    4. 一つの式のボディ
(defun hello-world () (format t "hello, world"))
  • もう少し複雑なものをみると、下記のようになる。
    1. 関数の名前は、verbose-sum
    2. 2つの引数を取り、xとyに束縛される。
    3. ドキュメント文字列を持つ。
    4. ボディは、2つの式から成り、返り値は、+が引数を処理した値が、verbose-sum全体の返り値となる。
(defun verbose-sum (x y)
  "Sum any two numbers after printing a message."
  (format t "Summing ~d and ~d.~%" x y)
  (+ x y))