【发布时间】:2014-02-18 16:09:29
【问题描述】:
我正在尝试制作一个计算列表中列表数量的函数。
(defun test (a)
(if (equal a nil) (return-from test 0))
(if (not (listp a)) (print "case a") (return-from test (+ 0 (test (cdr a))))
(print "case b")(return-from test (+ 1 (test (cdr a)))))
)
我不知道调试器是如何工作的,所以我尝试了一些使用打印语句的新手调试。上面的代码甚至没有执行。我不知道为什么。有效但给出错误答案的原始代码如下:
(defun test (a)
(if (equal a nil) (return-from test 0))
(if (not (listp a)) (return-from test (+ 0 (test (cdr a))))
(return-from test (+ 1 (test (cdr a)))))
)
这是返回元素周期的数量,无论是否列表。我看不出我哪里错了。另一个问题也是,当我调用 (test 1) 或对任何原子进行测试时,它会崩溃。当然,您不能获取原子的 cdr,但我可以进行哪些错误检查?我可以进行哪些更改才能使这个荒谬的功能发挥作用?
【问题讨论】:
-
好的,我很遗憾向您展示了
return-from示例 ;-) 再一次,cond会将您救到这里。 -
我不确定条件... 其工作方式的含义。它是在发现第一个为真后检查每个语句还是只执行第一个为真的语句?这是我没有使用它的唯一原因。再次感谢您的耐心和帮助!
-
@user3270407 如果你使用 Common Lisp,这里有关于 cond 的信息:clhs.lisp.se/Body/m_cond.htm 在大多数 lisps 中 cond 的行为都是一样的。
-
只有第一个是真的。见clhs.lisp.se/Body/m_cond.htm。
标签: lisp