&optionalの考察
先日、&keyというのを試してみたので、今回は&optionalをやってみる。まず、サンプルとする関数は
(defun optional-func (a b &optional c d) (list a b c d))
としてみる。実行してみると、以下のような感じになる。
? (optional-func "A") > Error: Too few arguments in call to #<Compiled-function OPTIONAL-FUNC #x30200056E80F>: > 1 argument provided, at least 2 required. > While executing: OPTIONAL-FUNC, in process listener(1). > Type :POP to abort, :R for a list of available restarts. > Type :? for other options. 1 > q ? (optional-func "A" "B") ("A" "B" NIL NIL) ? (optional-func "A" "B" "C") ("A" "B" "C" NIL) ? (optional-func "A" "B" "D") ("A" "B" "D" NIL) ? (optional-func "A" "B" nil "D") ("A" "B" NIL "D") ?
どうやら、&optionalより前にあるパラメータは必須で、これが足りない場合はエラーになってしまうようだ。
そして、&optionalより後のパラメータはあってもなくてもよい。ない場合はnilとして扱われる。さらに、
順番までキッチリ意識してやらないといけないようだ。&keyだと、順番は意識しなくてもキーワードで指定した
パラメータの値を設定することができたと思うので、こっちの方が使い勝手よさそうに思うのだが・・・