我何时会使用mapc而不是mapcar?

时间:2014-05-31 09:46:53

标签: map lisp common-lisp

到目前为止,我一直在使用mapcar将函数应用于列表的所有元素,例如:

(mapcar (lambda (x) (* x x))
        '(1 2 3 4 5))
;; => '(1 4 9 16 25)

现在我了解到还有mapc函数完全相同,但没有返回新列表,而是原始列表:

(mapc (lambda (x) (* x x))
      '(1 2 3 4 5))
;; => '(1 2 3 4 5)

这个功能的意图是什么?如果我无法访问结果,我何时会使用mapc代替mapcar

2 个答案:

答案 0 :(得分:11)

Common Lisp Hyperspec说:

mapcmapcar类似,只是不会累积应用函数的结果。返回list参数。

因此,在为可能的副作用进行映射时使用它。可以使用mapcar,但mapc可以减少不必要的费用。它的返回值也是原始列表,可以用作另一个函数的输入。

示例:

(mapc #'delete-file (mapc #'compile-file '("foo.lisp" "bar.lisp")))

上面首先编译源文件,然后删除源文件。因此编译的文件将保留。

(mapc #'delete-file (mapcar #'compile-file '("foo.lisp" "bar.lisp")))

上面首先编译源文件,然后删除已编译的文件。

答案 1 :(得分:2)

如果您不需要在列表中使用该功能的结果,则应使用mapc。例如,要打印出每个元素,您可以使用:

(mapc #'print '(1 2 3 4 5))

从技术上讲,print函数会返回一些内容,但你不需要使用它,所以你忽略它。