【发布时间】:2013-11-25 08:41:10
【问题描述】:
学习 lisp 最难的部分可能是以“lisp 方式”进行思考,这种方式优雅而令人印象深刻,但并不总是那么容易。我知道递归被用来解决很多问题,我正在研究一本书,而不是使用apply 来解决很多问题,我知道这不像lispy,也不那么便携。
一个有经验的 lisper 应该能够在不知道 describe-path location 和 edges 所指的具体内容的情况下帮助解决这个逻辑。这是我正在阅读的书中的一个示例:
(defun describe-paths (location edges)
(apply (function append) (mapcar #'describe-path
(cdr (assoc location edges)))))
我已成功重写此代码以避免apply 并改用递归。它似乎正在工作:
(defun describe-paths-recursive (location edges)
(labels ((processx-edge (edge)
(if (null edge)
nil
(append (describe-path (first edge))
(processx-edge (rest edge))))))
(processx-edge (cdr (assoc location edges)))))
我希望有更多经验丰富的人来建议是否有更优雅的方式将apply 转换为递归,或者我是否做了一些不明智的事情。这段代码看起来不错,但会有更“口齿不清”的东西吗?
【问题讨论】:
-
如果你想要代码审查,有codereview.stackexchange.com。 Stackoverflow 是针对实际实际问题的。
-
更多“Lispy”是为了避免堆栈溢出。
-
@RainerJoswig 谢谢,虽然我认为这很实用。诚然,我是 lisp 新手,stackoverflow 的这个 lisp 领域的文化似乎与我在这里工作过的其他语言非常不同。这将是一个受欢迎的问题,在 C++ 等领域得到了很多答案
-
原始版本是递归的。它在对 MAPCAR 的调用中调用自己。
-
@ThomasBartscher 不,它没有。仔细看,功能不一样。
标签: lisp common-lisp