common-lisp - 在 apply mapcar 中使用 `cons`

标签 common-lisp

在 Lisp Koans 中,使用以下形式 here转置矩阵:

(defun transpose (L) (apply #'mapcar (cons #'list L)))

当我解析这个函数时,(cons #'list L) 返回一个列表 '(#'list L1 L2 L3 ...),其中 L_i 是矩阵 L 的列。然后 apply 展开列表,现在 mapcar listL 的列作为列表的参数,它构造了 的行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 中,您必须显式调用 CONSLIST*

关于common-lisp - 在 apply mapcar 中使用 `cons`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035369/

相关文章:

lisp - 为什么阅读器宏扩展不传播到运行时(读取)?

iteration - Lisp,向后迭代

web - 如何从其他 RESTAS 模块访问 RESTAS 子模块的上下文

lisp - 如何显示前 N 个自然数,知道 Lisp 中的除数

lisp - 口齿不清错误 : Expected-type: REAL datum: NIL

Lisp: defmacro with &optional 和 &body

lisp 二次方程的虚部和实部

Lisp:'nil 和 nil 之间有什么区别吗?

common-lisp - 常见的 lisp 实现在运行时修改堆栈大小

common-lisp - 用于连接字符串列表的 lisp 函数