在 Lisp Koans 中,使用以下形式 here转置矩阵:
(defun transpose (L) (apply #'mapcar (cons #'list L)))
当我解析这个函数时,(cons #'list L)
返回一个列表 '(#'list L1 L2 L3 ...)
,其中 L_i
是矩阵 L
的列。然后 apply
展开列表,现在 mapcar list
将 L
的列作为列表的参数,它构造了 的行L
.
我想知道是否有任何理由,除了强制新的 Lisp 学生记住和理解 cons
的用法之外,而不是简单地写
(defun transpose (L) (apply #'mapcar #'list L))
因为 L
已经是一个列表(列(作为列表)),apply
会将 #'list
添加到 中的列表中code>L
在解压它们之前。
这还能再简化吗?我认为 apply
是解压参数以使用 mapcar
从行中创建列表所必需的,但我是函数式编程的新手。
谢谢!
最佳答案
Lisp Koans 是由 Maclisp 程序员编写的,远早于 Common Lisp 存在。在 Maclisp 中,APPLY
只接受两个参数,一个函数和一个参数列表。 Common Lisp 概括了这一点,以允许您使用的语法。但在 Maclisp 中,您必须显式调用 CONS
或 LIST*
。
关于common-lisp - 在 apply mapcar 中使用 `cons`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035369/