到目前为止,我一直在使用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说: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")))
上面将首先编译源文件,然后删除编译后的文件。