Next: , Previous: , Up:   [Contents][Index]


9.1 列の基本

列関数の多くはキーワード引数をとる; see 引数リスト. すべての キーワード引数は付加的であり、指定される場合は任意の順序に現れてよい。

:key引数は、nilあるいは1引数の関数を 渡されなければならない。このキー関数は、それを通して列の要素が 見えるようなフィルタとして使われる; たとえば、 (find x y :key 'car)(assoc* x y)と似ている: x 自身に等しい要素ではなく、そのcarxに等しいリストの 要素を検索する。:keyが省略されるかnilの場合、フィルタは 実際には恒等関数である。

:test:test-not引数は、nilあるいは2引数の 関数でなければならない。テスト関数は、2つの列要素を比較するために、 あるいは検索値と列要素を比較するために使われる(2つの値は、それから 派生したオリジナルの列関数の引数と同じ順序で、両方が同じ列からくる 場合は列に現れるのと同じ順序で、テスト関数に渡される)。:test 引数は、マッチを示すために真(非nil)を戻す関数を 指定しなければならない; そのかわりに、マッチを示すためにを 戻す関数を与えるために:test-notを使ってもよい。既定のテスト 関数は:test 'eqlである。

item:testまたは:test-notをとる関数の多くには、 変種-if-if-notもある。そこでは、predicate関数が itemの代わりに渡され、その述語が真(あるいは-if-notの 場合は偽)を戻す場合、列の要素はマッチする。たとえば:

(remove* 0 seq :test '=)  ≡  (remove-if 'zerop seq)

は、列seqからすべての0を取り除く。

いくつかの演算は、引数列の部分列に働くことができる; これらの関数は、 既定がそれぞれ0と列の長さである:start:end引数をとる。 start(含む)とend(含まない)の間の要素だけが、その演算に 影響される。end引数は、列の長さを表わすためにnilを 渡されてもよい; さもなければ、startendはともに整数で、 0 <= start <= end <= (length seq) でなければならない。関数が2つの列引数をとる場合、制限は、第1の列は キーワード:start1:end1で、第2の列はキーワード :start2:end2で定義される。

いくつかの関数は、:from-end引数と:count引数を 受け入れる。:from-endが非nilの場合、演算が左から 右へではなく右から左へ列を通っていくことを引き起こし、:count は、取り除かれるか処理されるかする要素の最大数の整数を指定する。

列関数は、:test:test-not:key関数がさまざまな 要素上で呼び出される順序を保証しない。したがって、これらの関数の 副作用に依存するのは悪い考えである。たとえば、:from-endは列が 実際に逆順で走査されることを引き起こすかもしれないし、正順で走査して、 しかし後ろから走査されたように結果を計算してもよい(mapcar*everyのようないくつかの関数は、副作用がこれらの場合は完全に 受け入れられるように、関数が呼び出される順序を正確に指定する)。

GNU Emacs 19の文字列は、文字データと同様に“テキスト属性”を 含んでもよい。注がある場合を除いて、列関数によってテキスト属性が 保存されるかどうかは未定義である。たとえば (remove* ?A str)は、strからコピーされて結果として 生じた文字の属性を保存するかもしれないし、保存しないかもしれない。