% Function MAP-INTO
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)
a => (11 12 13 14)
b => (10 10 10 10)
(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)
a => (#:G9090 #:G9091 #:G9092 #:G9093)
なし。
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)