Function MAPC, MAPCAR, MAPCAN, MAPL, MAPLIST, MAPCON

UP


Function MAPC, MAPCAR, MAPCAN, MAPL, MAPLIST, MAPCON

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 - リスト

定義

マッピング操作は、 引数の各列からひとつ得たものの集合を、 連続で関数に適用した結果を返却します。 mapcmapl以外は、関数の返却値で構成された結果を返却します。 mapcmaplの場合は、返却値はlistsの列です。

functionは、最初はインデックス0番目の全ての要素で呼び出され、 そのあとインデックス1番目の全ての要素で呼ばれ、 以下同様に実行します。 もしfunctionがシンボルのときは、 それはsymbol-functionが実行されたかのように 関数へcoerceされます。

mapcarは、listsの連続した要素に対して操作します。 functionは、各listsの最初の要素で適用し、 そのあと各listsの二番目の要素で適用し、 それを繰り返します。 繰り返しは最短のlistsがなくなったときに終了し、 他のlistsの余分な要素は無視されます。 mapcarの返却値は、 functionが連続して呼び出された結果のリストです。

mapcmapcarと似ていますが、 適用されたfunctionの結果を蓄積しない所が違っています。 lists引数が返却されます。

maplistmapcarと似ていますが、 functionは、listsのサブリストを連続して適用するところが違っています。 functionは、最初はlistsそのものに適用され、 そのあと各listscdrによって適用され、 さらに各listscdrcdrによって適用され、 それをくり返します。

maplmaplistと似ていますが、 適用されたfunctionの結果を蓄積しない所が違っています。 list-1が返却されます。

mapcanmapconは、 それぞれmapcarmaplistに似ていますが、 適用したfunctionの結果を、 listではなくnconcによって リストに結合するところが違っています。

これは次のような関係であり、

(mapcon f x1 ... xn)
  ==  (apply #'nconc (maplist f x1 ... xn))

mapcanmapcarの関係に似ています。

Examples:

(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のエラーを通知する準備をしなければなりません。

参考

dolist, map, 3.6. 横断の規則と副作用

備考

なし。


TOP, Github