You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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)

修改点说明

  1. 在cond的第一个分支新增空列表判断(null li),遍历到列表尾部时直接返回nil终止递归,不会再执行后续的car li取值和=比较逻辑,从根源避免了nil和数字比较的类型错误。
  2. 删掉了冗余的重复判断分支,最后用默认t分支处理不匹配的场景,直接递归遍历剩余列表,逻辑更简洁也消除了死分支问题。

内容的提问来源于stack exchange,提问作者Chow Zheng Xuan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 20:45:01