関数の記述では、まず始めに説明対象の関数名があります。 同じ行には、引数名の並びも続きます。 これらの名前は、説明文の中で引数の値を参照するために使います。
引数ならびにキーワード&optional
が現れていれば、
それ以降の引数を省略できることを示します(省略した引数の値はnil
)。
関数を呼び出すときに&optional
を書いてはいけません。
キーワード&rest
(このあとには1つの引数名だけが続く)は、
残りの引数が何個でもよいことを示します。
直後にある1つの引数名は、変数としての値を持ち、
その値は残りのすべての引数のリストです。
関数を呼び出すときに&rest
を書いてはいけません。
では、仮想的な関数foo
の記述を以下に示します。
関数
foo
は、integer2からinteger1を引き算し、 残りのすべての引数を減算結果に加える。 integer2を指定しないと、デフォルトでは、数19から引き算する。(foo 1 5 3 9) ⇒ 16 (foo 5) ⇒ 14より一般的には、つぎのとおり。
(foo w x y...) == (+ (- x w) y...)
(integer、integer1、bufferなどの)型名を名前とする引数は、 その型の値であると仮定します。 (buffersのように)型を複数形にした場合には、 しばしば、その型のオブジェクトのリストを意味します。 objectという名前の引数は、任意の型でかまいません。 (Emacsオブジェクトの型の一覧については、see Lisp Data Types)。 (new-fileなどの)その他の名前の引数は、関数の説明文の中で言及します。 複数の関数の引数に共通する特徴について、 節の始めで説明する場合もあります。
&optional
と&rest
についての詳しい説明は、
See Lambda Expressions。
コマンド、マクロ、スペシャルフォームの記述も同じ形式ですが、 「関数」のかわりに 「コマンド」、「マクロ」、「スペシャルフォーム」のいずれかです。 コマンドは、対話的に呼び出せる単なる関数です。 マクロは関数とは違った方法で引数を処理します(引数を評価しない)が、 同じ方法で引数を記します。
スペシャルフォームの記述では、省略可能な引数や繰り返される引数を 示すために、より複雑な記法を使います。 というのは、引数並びを個々の引数に分離する方法が複雑だからです。 ‘[optional-arg]’は、 optional-argが省略可能であることを示します。 また、‘repeated-args...’は、0個以上の引数を示します。 いくつかの引数をリスト構造の内側にまとめるときには、 括弧を使います。
この仮想的なスペシャルフォームは、 フォーム群bodyを実行してから変数varを増やすことを 反復するループを実現する。 最初は、変数の値はfromである。 以降の反復では、変数を1(あるいは、指定があればincだけ)増やす。 varがtoに等しくなると、 bodyを実行せずにループから抜ける。 例を示す。
(count-loop (i 0 10) (prin1 i) (princ " ") (prin1 (aref vector i)) (terpri))fromとtoを省略すると、 ループ開始前にvarに
nil
を束縛し、 各反復の開始時にvarがnil
以外であるとループから抜け出る。(count-loop (done) (if (pending) (fixit) (setq done t)))このスペシャルフォームでは、引数fromとtoは省略できるが、 両者を同時に指定するか、同時に省略すること。 これらを指定した場合、incを指定してもよい。 これらの引数は、引数varとともにリストにまとめる。 これはbodyと区別するためであり、 bodyは残りのフォームの要素すべてを含む。