mapc与mapcar的区别


#1

找了一篇日本人写的关于mapc与mapcar的介绍

;; mapcar関数はリストの各々の要素に関数をapplyした結果をリストとして返す。

;; mapcar函数是对列表中各个元素分别调用函数处理,再把结果形成一个列表并返回。
(defun mapcar (fn mlist)
       (cond ((null mlist) nil)
             (t (cons (funcall fn (car mlist))
                      (mapcar fn (cdr mlist)) ))))
;; mapcはmapcarとよく似ているが、返り値は引数として渡したもとのリストなので、
;; 関数に何らかの副作用(破壊的なリストの変更やその他出力)がなければ引数として
;; 渡したリストがそのまま返る。

;; map和mapcar虽然相似,由于返回值就是作为参数传递进来的原始列表,
;; 如果函数中没有副作用(破坏性列表更改或其他输出)的话,就把传递进来的列表原样返回。
(defun mapc (fn mlist)
       (do ((x mlist (cdr x))) ; リストはコピーしてから使う
           ((null x) mlist)    ; コピーが空になったら元のリストを返す
           (funcall fn (car x)) ))

mapc直接返回的是传进来的mlist,fn对元素有副作用的话,mlist也就被破坏了。


#2

MAPCAR: MAPC then Accumulate the Result with `list’

MAPCAN: MAPC then Accumulate the result with Nconc


也有一说-car的意思是用cdrcar来取下一个元素。


用JS来举例子。mapcar是Array.prototype.map

mapc是Array.prototype.forEach