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 |

2007-12-24

Practical Common Lisp (14)

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

引き続きPractical Common Lisp 第4章4. Syntax and Semanticsを読んでメモしてみています。

Special Operators

  • 全部が全部、関数の形式で解決できるというわけではない。
    • 関数の引数は、関数に渡される前に評価済みになっていなくてはならないため
  • IFを例にとって詳細を解説 (if x (format t "yes") (format t "no")) というフォームを考える。
  • 仮にIFが関数だとすると、引数は左から右に順に評価されることになる。この場合だと、formatの返り値は、NILとなり、X、NIL、NILが関数に渡され処理されることになる。しかし、それだとIFが真偽を分岐させる前にyesもnoも表示されてしまうことになる。
  • この問題を解決するために、スペシャルオペレータが導入されている。Common Lispの処理系には、そのようなものが25用意されている。
  • もし、リストの最初のシンボルがスペシャルオペレータならば、残りの引数の評価方法はそのスペシャルオペレータが規定する評価順序に従う。
  • IFの場合だと、最初の引数を評価して、それが、NILでないならば、その次を評価し、結果を返す。それ以外は、一つ飛して3番目を評価し、結果を返す。(if test-form then-form [ else-form ])
  • test-formは常に評価され、then-formが評価されるか、else-formが評価されるかする。
  • 同様に単純なスペシャルオペレータとして、QUOTEがある。一つの引数を取り、単純にそれを返す。しかし評価はされない。(+ 1 2)というリストが渡された場合、3ではなく、(+ 1 2)を返す。 (quote (+ 1 2))
  • QUOTEは、広く使われるので、リーダに簡便な記法が組込まれ用意されている
  • (quote (+ 1 2))と書く代わりに、'(+ 1 2)と書ける。
  • この文法は、リーダーによって解釈されるS式のちょっとした拡張になっているので、どちらの記法をしても、結果を渡される評価器からすれば、最初が、QUOTEで残りが(+ 1 2)というリストということになる。
  • 一般的に言えば、スペシャルオペレータは、評価器による特別な解釈を要求する。幾らかのスペシャルオペレータは変数環境等の環境を操作するものがある。例えば、LETは、新しい変数の束縛をつくる。それら一部は、6章で詳細を検討する。
  • (let ((x 10) ) x)は、10が評価値となるが、これは、2番目に出てくるxが評価された値となっている。そのxは、(x 10)として束縛されたxの値となっている。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071224