gpt4 book ai didi

lisp - 如何检查所有列表是否都是数字

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

我构建这个函数来检查列表中的所有“var”是否都是数字。这是我尝试做的

(defun check6 (list) 
(if (null list) 'TRUE)
(if (not (numberp(first list))) nil)
(check6 (rest list)))

但我总是得到堆栈溢出。

为什么?

最佳答案

堆栈溢出是因为你有几个不相关的if,所以它们产生了一个未被消耗的值,继续执行剩下的函数体。这意味着 check6 永远不会终止并导致溢出。

如果您将代码粘贴到自动对齐代码行的适当编辑器中,您会发现编辑器产生了这种对齐方式:

(defun check6 (list) 
(if (null list)
'TRUE) ; only one branch, no else branch, continue to the next form
(if (not (numberp(first list)))
nil) ; again only one branch, continue to the next form
(check6 (rest list))) ; infinite loop

如果要使用if 特殊运算符,请记住它有两种情况,即条件为真和为假,并且应该以这种方式嵌套表格(再次正确对齐):

(defun check6 (list) 
(if (null list)
t
(if (not (numberp (first list)))
nil
(check6 (rest list)))))

但是 Common Lisp 有更方便的语法来连接条件,cond:

(defun check6 (list) 
(cond ((null list) t)
((not (numberp (first list))) nil)
(t (check6 (rest list)))))

最后,请注意还有其他方法可以通过使用迭代来解决您的问题:

(defun check6 (list)
(loop for element in list always (numberp element)))

或者使用高级函数,以更简洁的方式:

(defun check6 (list)
(every #'numberp list))

关于lisp - 如何检查所有列表是否都是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295340/

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