Next: Function Documentation, Previous: Simple Lambda, Up: Lambda Expressions
単純な関数の例(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