単純な関数の例(lambda (a b c) (+ a b c))では、
3つの引数変数を指定しているので、これは3引数で呼び出す必要があります。
2引数や4引数で呼び出そうとすると、
エラーwrong-number-of-argumentsになります。
特定の引数を省略できる関数を書けると便利なことがしばしばあります。
たとえば、関数substringは3つの引数、つまり、
文字列、開始と終了の添字を取りますが、
第3引数を省略するとデフォルトは文字列のlengthになります。
listや+のように、
特定の関数では任意個数の引数を受け付けると便利なこともあります。
関数呼び出し時に省略してもよい引数を指定するには、
省略可能な引数のまえにキーワード&optionalを含めるだけです。
0個以上の引数のリストを指定するには、
最後の引数のまえにキーワード&restを含めます。
したがって、引数リストの完全な構文はつぎのようになります。
(required-vars...
; 必須の引数
[&optional optional-vars...]
; 省略可能な引数
[&rest rest-var])
; 残りの引数
角括弧は、&optionalや&restの節や
それに続く変数は省略できることを示します。
関数呼び出し時には、各required-varsに1つの実引数が必要です。
0個以上のoptional-varsにも実引数が必要ですが、
ラムダリストに&restがない限り、
optional-varsの個数を超える実引数は指定できません。
&restがあれば、任意個の余分な実引数を指定できます。
&optionalや&restに対応する実引数を省略すると、
それらのデフォルトはnilです。
関数では、nilを明示した引数と省略した引数とを区別する方法はありません。
しかしながら、関数本体でnilを適切な意味ある値の省略と
みなすことは自由です。
substringはそのようにしています。
substringの第3引数がnilであると、
指定した文字列の長さを使うことを意味します。
Common Lispに関した注意:
Common Lispでは、省略可能引数を省略したときのデフォルト値を関数で指定できる。
Emacs Lispではつねにnilを使う。
Emacs Lispには、明示的に引数を指定したかどうか調べる
『supplied-p』変数はない。
たとえば、引数リストはつぎのようになります。
(a b &optional c d &rest e)
これは、aとbに最初の2つの実引数を束縛し、これらは必須です。
さらに1個か2個の引数を指定すると、
それらは、それぞれcとdに束縛します。
最初の4個よりあとの引数はリストにまとめ、
eにそのリストを束縛します。
引数が2個だけであると、cはnilです。
引数が2個か3個だけであると、dはnilです。
引数が4個以下であると、eはnilです。
省略可能な引数のあとに必須引数を指定する方法はありませんし、
それには意味がありません。
なぜそうなのかを理解するために、上の例で、
cは省略可能であり、dは必須であるとしましょう。
3つの実引数を指定したとき、どの引数を3番目と考えるのでしょう?
同様に、&restのうしろに余分に(必須、もしくは省略可能な)引数が
あっても意味がありません。
引数リストと正しい呼び出しの例をあげます。
((lambda (n) (1+ n)) ; 1個が必須
1) ; 引数は1個だけ
=> 2
((lambda (n &optional n1) ; 1個は必須、1個は省略可
(if n1 (+ n n1) (1+ n))) ; 引数は1個か2個
1 2)
=> 3
((lambda (n &rest ns) ; 1個は必須、あとは残り全部
(+ n (apply '+ ns))) ; 引数は1個以上いくつでもよい
1 2 3 4 5)
=> 15