【发布时间】:2013-12-11 00:05:17
【问题描述】:
在this very useful answer,有人建议我可以替换这段代码:
(defun describe-paths (location edges)
(apply (function append) (mapcar #'describe-path
(cdr (assoc location edges)))))
有了这个:
(defun describe-paths-mapcan (location edges)
(mapcan #'describe-path
(cdr (assoc location edges))))
我当然从概念上理解为什么这应该起作用,但事实并非如此;第二个变体冻结了我的 REPL 并且 CL 提示永远不会返回。我必须重新启动 SLIME。所以我looked it up,我想知道mapcan 不使用list,而是使用nconc,是否是原因?因此这些实际上不是功能相同的代码块?
为了好奇,我通过这个:
(describe-paths-mapcan 'living-room *edges*)
*edges* 在哪里:
(defparameter *edges* '((living-room (garden west door)
(attic upstairs ladder))
(garden (living-room east door))
(attic (living-room downstairs ladder))))
还有:
(defun describe-path (edge)
`(there is a ,(caddr edge) going ,(cadr edge) from here.))
【问题讨论】:
-
这是来自Lisp之国吗?
-
@DaoWen 最初,但我正在尝试用其他方法来编写那本书中的示例,这样我可以更好地学习语言
标签: lisp common-lisp