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


9.2 列上のマッピング

これらの関数は、リストまたは配列の要素上に、指定した関数を“マップ” する。それらはすべて、組み込み関数mapcarのテーマの変奏である。

Function: mapcar* function seq &rest more-seqs

この関数は、その引数列に連続する並列の要素の集合上でfunctionを 呼び出す。1つのseq引数の場合、mapcarと同等である; n 列の場合、結果のリストの第1要素を生み出すために、それぞれの列の 第1要素をn引数として関数を呼び出す。それから第2要素以降にも 同様に呼び出す。マップは、最も短い列が尽きたらすぐに止まる。引数列は、 リストや文字列、ベクタのいずれの混合でもよい; 戻される列は常に リストである。

Common Lispのmapcarは多重引数を受け入れるが、リスト上でのみ 動作する; Emacs Lispのmapcarは1つの列引数を受け入れる。この パッケージのmapcar*は、両方に互換なスーパーセットとして 動作する。

Function: map result-type function seq &rest more-seqs

この関数は、ちょうどmapcar*のように、引数列の上にfunction をマップするが、リストではなく型result-typeの列を戻す。 result-typeは下記のシンボルの1つでなければならない: vectorstringlist(この場合、効果は mapcar*と同じ)、またはnil(この場合、結果は捨て去られ、 mapnilを戻す)。

Function: maplist function list &rest more-lists

この関数は、その引数リストのそれぞれの上でfunctionを呼び出して、 それらのリストのcdrの上で呼び出して、というように最短のリストが 尽きるまで続く。結果はリストのフォーム中に戻される。したがって maplistは、前進するポインタのcarではなく、リストの ポインタ自身を通っていく点を除いて、mapcar*と似ている。

Function: mapc function seq &rest more-seqs

この関数はmapcar*と似ているが、functionによって戻される 値はリストに集積されるのではなく、無視され捨て去られる点が異なる。 mapcの戻り値は、第1の列seqである。

Function: mapl function list &rest more-lists

この関数はmaplistに似ているが、functionによって戻される 値を捨て去る点が異なる。

Function: mapcan function seq &rest more-seqs

この関数はmapcar*に似ているが、単に戻り値 (リストでなければならない)を集積するのではなく、nconcを使って 連結する点が異なる。

Function: mapcon function list &rest more-lists

この関数はmaplistに似ているが、nconcを使って戻り値を 連結する点が異なる。

Function: some predicate seq &rest more-seqs

この関数は、順にseqの各要素にpredicateを呼び出す; predicateが非nilを戻す場合、someはその値を戻し、 そうでなければnilを戻す。いくつかの列引数が与えられる場合、 ちょうどmapcar*のように、最短の列が尽きるまで並列に列を通る。 左から右への順序で要素が訪問されることや、predicateが 非nilを戻すとすぐにマッピングが止まるという事実に依存できる。

Function: every predicate seq &rest more-seqs

この関数は、順に列の各要素にpredicateを呼び出す; predicate がいずれかの要素でnilを戻すとすぐにnilを、述語がすべての 要素で真の場合にtを戻す。

Function: notany predicate seq &rest more-seqs

この関数は、順に列の各要素にpredicateを呼び出す; predicate がいずれかの要素で非nilを戻すとすぐにnilを、述語がすべて の要素でnilの場合にtを戻す。

Function: notevery predicate seq &rest more-seqs

この関数は、順に列の各要素にpredicateを呼び出す; predicate がいずれかの要素でnilを戻すとすぐに非nilを、述語がすべて の要素で真の場合にtを戻す。

Function: reduce function seq &key :from-end :start :end :initial-value :key

この関数は、結合二項演算を使って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の方が 速いだろう。