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-06

Practical Common Lisp (21)

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

Practical Common Lisp 第5章5. Functionsを読んでメモしてみています。

Rest Parameters

  • 引数の扱いには、様々あるが引数の数を可変にしたいことがある。例えば、FORMATは、2つ以上の引数を取るが、2つ目以降は必要に応じて与える引数が増減する。+も同様。0個の場合もあり、(+)は0となる。
(format t "hello, world")
(format t "hello, ~a" name)
(format t "x: ~d y: ~d" x y)
(+)
(+ 1)
(+ 1 2)
(+ 1 2 3)
  • 必須引数や、オプショナル引数等をやりくりして対応することもできるが、対応させるのは困難。。ちなみに取れる最低限50以上は引数が取れることを保証することが規格で定められている。実装により上限は異なるが、CALL-ARGUMENTS-LIMITで処理系の上限を確認できる。(SBCL 1.0.13では、1,152,921,504,606,846,975だった)
  • このような問題を解決するのが、&RESTパラメータで、&RESTに指定された変数がリストとなり、以降の引数が格納される。FORMATや、+は下記のように定義できる。
(defun format (stream string &rest values) ...)
(defun + (&rest numbers) ...)