これらの関数は、リストまたは配列の要素上に、指定した関数を“マップ”
する。それらはすべて、組み込み関数mapcarのテーマの変奏である。
この関数は、その引数列に連続する並列の要素の集合上でfunctionを
呼び出す。1つのseq引数の場合、mapcarと同等である; n
列の場合、結果のリストの第1要素を生み出すために、それぞれの列の
第1要素をn引数として関数を呼び出す。それから第2要素以降にも
同様に呼び出す。マップは、最も短い列が尽きたらすぐに止まる。引数列は、
リストや文字列、ベクタのいずれの混合でもよい; 戻される列は常に
リストである。
Common Lispのmapcarは多重引数を受け入れるが、リスト上でのみ
動作する; Emacs Lispのmapcarは1つの列引数を受け入れる。この
パッケージのmapcar*は、両方に互換なスーパーセットとして
動作する。
この関数は、ちょうどmapcar*のように、引数列の上にfunction
をマップするが、リストではなく型result-typeの列を戻す。
result-typeは下記のシンボルの1つでなければならない:
vector、string、list(この場合、効果は
mapcar*と同じ)、またはnil(この場合、結果は捨て去られ、
mapはnilを戻す)。
この関数は、その引数リストのそれぞれの上でfunctionを呼び出して、
それらのリストのcdrの上で呼び出して、というように最短のリストが
尽きるまで続く。結果はリストのフォーム中に戻される。したがって
maplistは、前進するポインタのcarではなく、リストの
ポインタ自身を通っていく点を除いて、mapcar*と似ている。
この関数はmapcar*と似ているが、functionによって戻される
値はリストに集積されるのではなく、無視され捨て去られる点が異なる。
mapcの戻り値は、第1の列seqである。
この関数はmaplistに似ているが、functionによって戻される
値を捨て去る点が異なる。
この関数はmapcar*に似ているが、単に戻り値
(リストでなければならない)を集積するのではなく、nconcを使って
連結する点が異なる。
この関数はmaplistに似ているが、nconcを使って戻り値を
連結する点が異なる。
この関数は、順にseqの各要素にpredicateを呼び出す;
predicateが非nilを戻す場合、someはその値を戻し、
そうでなければnilを戻す。いくつかの列引数が与えられる場合、
ちょうどmapcar*のように、最短の列が尽きるまで並列に列を通る。
左から右への順序で要素が訪問されることや、predicateが
非nilを戻すとすぐにマッピングが止まるという事実に依存できる。
この関数は、順に列の各要素にpredicateを呼び出す; predicate
がいずれかの要素でnilを戻すとすぐにnilを、述語がすべての
要素で真の場合にtを戻す。
この関数は、順に列の各要素にpredicateを呼び出す; predicate
がいずれかの要素で非nilを戻すとすぐにnilを、述語がすべて
の要素でnilの場合にtを戻す。
この関数は、順に列の各要素にpredicateを呼び出す; predicate
がいずれかの要素でnilを戻すとすぐに非nilを、述語がすべて
の要素で真の場合にtを戻す。
この関数は、結合二項演算を使ってseqの要素を結合する。
functionが*でseqがリスト(2 3 4 5)だと
仮定する。最初のリストの2つの要素は(* 2 3) = 6と結合される;
これは次の要素(* 6 4) = 24と結合され、最後の要素
(* 24 5) = 120と結合される。*関数はたまたま
自己縮約的なので、(* 2 3 4 5)はreduceへの明示的な
呼び出しと同じ効果を持つことに注意せよ。
:from-endが真の場合、縮約は左結合の代わりに右結合である:
(reduce '- '(1 2 3 4))
≡ (- (- (- 1 2) 3) 4) ⇒ -8
(reduce '- '(1 2 3 4) :from-end t)
≡ (- 1 (- 2 (- 3 4))) ⇒ -2
:keyが指定された場合、それは順に列の各要素上で呼び出される、
1引数の関数である。
:initial-valueが指定された場合、それは実際に列の先頭に
(:from-endの場合は末尾に)加えられる。:key関数は初期値に
は適用されない。
列が、初期値を含めて正確に1つの要素を持つ場合、その要素は決して functionを呼び出すことなしに戻される。列が空の(そして 初期値がない)場合、functionは戻り値を得るために、引数なしで呼び 出される。
これらのマッピング演算はすべて、loopマクロで便利に
表現することができる。コンパイルされたコードでは、関数呼び出しのない
インラインコードとしてループを生成するので、loopの方が
速いだろう。