调用Lisp的check-num函数报'NIL' is not of the expected type 'NUMBER'如何解决
问题修复方案
错误原因
你的代码存在两个核心问题导致报错:
- 缺失空列表终止判断:递归遍历到列表尾部(
li为nil)时,没有优先处理空列表的情况,直接执行(car li)拿到nil,用=操作符比较数字和nil触发类型不匹配错误,也就是你看到的'NIL' is not of the expected type 'NUMBER'报错。 - 条件分支逻辑冗余:
cond的第二个和第三个分支判断条件完全一致,cond按顺序匹配分支的规则下第三个分支永远不会被执行,你原本设计的“遍历完未找到返回nil”的逻辑无法触发。
修复后代码
(defun check-num (li n) (cond ((null li) nil) ; 空列表直接返回未找到,终止递归 ((= n (car li)) t) ; 匹配到目标值返回t (t (check-num (cdr li) n)))) ; 不匹配则继续遍历剩余列表 (check-num '(1 2 3 4 5) 6)
修改点说明
- 在
cond的第一个分支新增空列表判断(null li),遍历到列表尾部时直接返回nil终止递归,不会再执行后续的car li取值和=比较逻辑,从根源避免了nil和数字比较的类型错误。 - 删掉了冗余的重复判断分支,最后用默认
t分支处理不匹配的场景,直接递归遍历剩余列表,逻辑更简洁也消除了死分支问题。
内容的提问来源于stack exchange,提问作者Chow Zheng Xuan
相关产品推荐
相关产品推荐

