到目前为止,我一直在使用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

最佳答案

常见的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")))

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

08-04 06:19