gpt4 book ai didi

lisp - 更简单的 Lisp 函数不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:15 25 4
gpt4 key购买 nike

我正在尝试制作一个函数来计算列表中列表的数量。

 (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)))))
)

我不知道调试器是如何工作的,所以我尝试了一些使用 print 语句进行调试的新手。上面的代码甚至不执行。我不知道为什么。可以运行但给出错误答案的原始代码如下:

 (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,但我可以做什么错误检查?我可以做哪些更改才能使这个荒谬的功能起作用?

最佳答案

第一个 block 不起作用,因为函数“if”最多处理其中的 3 个形式(条件 then-branch else-branch)。如果你想在一个分支中执行一些操作,你应该用 prog 包装它们:

(if (not (listp a))
(progn
(print "case a")
(return-from test (+ 0 (test (cdr a)))))
(progn
(print "case b")
(return-from test (+ 1 (test (cdr a))))))

第二个问题是检查(listp a)。您应该检查第一个元素是否是列表而不是整个列表是列表 (listp (car a))。

我不知道,您使用的是哪种 lisp 方言。在大多数情况下,“cond”形式可用,不需要特殊形式“return-from”。因此,您可以按如下方式重写函数:

(defun test (a)
(cond
((not (listp a)) nil) ; "atom" case
((not a) 0) ; empty list case
((listp (car a)) ; first element is list
(print "case list")
(+ 1 (test (cdr a))))
(T ; fist element is not list
(print "case not list")
(test (cdr a))))) ; avoid adding zero because it has no effect

关于lisp - 更简单的 Lisp 函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21859194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com