Function MAP-INTO
map-into
result-sequence function &rest sequences => result-sequence
result-sequence - 正常なシーケンス
function - sequencesにある複数の引数を取る関数の指定子
sequences - 正常なシーケンス
引数sequencesの各要素をfunctionに適用した結果を result-sequenceに含めるよう、破壊的に修正します。
result-sequenceとsequencesの各要素は、 それぞれリストかvector
のどちらかになります。 もしresult-sequenceとsequencesの各要素が、 全てかあるいはいくつかが同じ長さではないとき、 繰り返しはもっとも短いシーケンス (sequencesのどれかか、あるいはresult-sequence)が 使い終わったときに終わります。 もしresult-sequenceがfill-pointerを持ったvector
のとき、 そのfill-pointerは、何度繰り返しを行うかを決めるときには無視され、 その後、fill-pointerに関数が適用された回数が設定されます。 もしresult-sequenceが、sequencesの最も短いものより長いときは、 result-sequenceの末尾の余分な要素は変更されずに残されます。 もしresult-sequenceがnil
のときは、 nil
は長さ0
のシーケンスなので、 即座にnil
が返却されます。
もしfunctionに副作用があるなら、 最初にインデックス0
の全ての要素で呼ばれ、 次にインデックス1
の全ての要素で呼ばれ、 といったように数えることができます。
setq a (list 1 2 3 4) b (list 10 10 10 10)) => (10 10 10 10)
(map-into a #'+ a b) => (11 12 13 14)
(=> (11 12 13 14)
a => (10 10 10 10)
b setq k '(one two three)) => (ONE TWO THREE)
(map-into a #'cons k a) => ((ONE . 11) (TWO . 12) (THREE . 13) 14)
(map-into a #'gensym) => (#:G9090 #:G9091 #:G9092 #:G9093)
(=> (#:G9090 #:G9091 #:G9092 #:G9093) a
なし。
result-sequenceが正常なシーケンスでないとき、 型type-error
のエラーを通知する準備をしなければなりません。 sequencesの各要素が正常なシーケンスでないとき、 型type-error
のエラーを通知する準備をしなければなりません。
なし。
map-into
とmap
の違うところは、 シーケンスを作成するのではなく 既存のシーケンスを変更するところです。 加えて、map-into
は2つの引数のみで呼び出すことができますが、 それに対してmap
は最低でも3つの引数が必要です。
map-into
は下記のように定義できます。
defun map-into (result-sequence function &rest sequences)
(loop for index below (apply #'min
(length result-sequence)
(mapcar #'length sequences))
(do (setf (elt result-sequence index)
apply function
(mapcar #'(lambda (seq) (elt seq index))
(
sequences)))) result-sequence)