Function MAPC, MAPCAR, MAPCAN, MAPL, MAPLIST, MAPCON
mapc function &rest lists+ => list-1
mapcar function &rest lists+ => result-list
mapcan function &rest lists+ => concatenated-results
mapl function &rest lists+ => list-1
maplist function &rest lists+ => result-list
mapcon function &rest lists+ => concatenated-results
function - listsと同じ数の引数を取る関数指定子
lists - 通常のリスト
list-1 - 最初のlists(通常のリストである必要があります)
result-list - リスト
concatenated-results - リスト
マッピング操作は、 引数の各列からひとつ得たものの集合を、 連続で関数に適用した結果を返却します。 mapcとmapl以外は、関数の返却値で構成された結果を返却します。 mapcとmaplの場合は、返却値はlistsの列です。
functionは、最初はインデックス0番目の全ての要素で呼び出され、 そのあとインデックス1番目の全ての要素で呼ばれ、 以下同様に実行します。 もしfunctionがシンボルのときは、 それはsymbol-functionが実行されたかのように 関数へcoerceされます。
mapcarは、listsの連続した要素に対して操作します。 functionは、各listsの最初の要素で適用し、 そのあと各listsの二番目の要素で適用し、 それを繰り返します。 繰り返しは最短のlistsがなくなったときに終了し、 他のlistsの余分な要素は無視されます。 mapcarの返却値は、 functionが連続して呼び出された結果のリストです。
mapcはmapcarと似ていますが、 適用されたfunctionの結果を蓄積しない所が違っています。 lists引数が返却されます。
maplistはmapcarと似ていますが、 functionは、listsのサブリストを連続して適用するところが違っています。 functionは、最初はlistsそのものに適用され、 そのあと各listsのcdrによって適用され、 さらに各listsのcdrのcdrによって適用され、 それをくり返します。
maplはmaplistと似ていますが、 適用されたfunctionの結果を蓄積しない所が違っています。 list-1が返却されます。
mapcanとmapconは、 それぞれmapcarとmaplistに似ていますが、 適用したfunctionの結果を、 listではなくnconcによって リストに結合するところが違っています。
これは次のような関係であり、
(mapcon f x1 ... xn)
== (apply #'nconc (maplist f x1 ... xn))(mapcar #'car '((1 a) (2 b) (3 c))) => (1 2 3)
(mapcar #'abs '(3 -4 2 -5 -6)) => (3 4 2 5 6)
(mapcar #'cons '(a b c) '(1 2 3)) => ((A . 1) (B . 2) (C . 3))
(maplist #'append '(1 2 3 4) '(1 2) '(1 2 3))
=> ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3))
(maplist #'(lambda (x) (cons 'foo x)) '(a b c d))
=> ((FOO A B C D) (FOO B C D) (FOO C D) (FOO D))
(maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c))
=> (0 0 1 0 1 1 1)
;もし入力のリストに対応する要素が
;そのリスト内で最後の要素の場合は1
(setq dummy nil) => NIL
(mapc #'(lambda (&rest x) (setq dummy (append dummy x)))
'(1 2 3 4)
'(a b c d e)
'(x y z)) => (1 2 3 4)
dummy => (1 A X 2 B Y 3 C Z)
(setq dummy nil) => NIL
(mapl #'(lambda (x) (push x dummy)) '(1 2 3 4)) => (1 2 3 4)
dummy => ((4) (3 4) (2 3 4) (1 2 3 4))
(mapcan #'(lambda (x y) (if (null x) nil (list x y)))
'(nil nil nil d e)
'(1 2 3 4 5 6)) => (D 4 E 5)
(mapcan #'(lambda (x) (and (numberp x) (list x)))
'(a 1 b c 3 4 d 5))
=> (1 3 4 5)この場合は、関数はフィルタの役割を果たします。 これは標準のLispの語句のmapcanです。
(mapcon #'list '(1 2 3 4)) => ((1 2 3 4) (2 3 4) (3 4) (4)) なし。
listsが通常のリストではないとき、 型type-errorのエラーを通知する準備をしなければなりません。
なし。