Shammer's Philosophy

My private adversaria

&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だと、順番は意識しなくてもキーワードで指定した
パラメータの値を設定することができたと思うので、こっちの方が使い勝手よさそうに思うのだが・・・