到目前为止,我一直在使用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
?
答案 0 :(得分:11)
Common Lisp Hyperspec说:
mapc
与mapcar
类似,只是不会累积应用函数的结果。返回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
函数会返回一些内容,但你不需要使用它,所以你忽略它。