gpt4 book ai didi

lisp - `A' 不是预期的类型 `REAL'

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

服务器下面的代码显示列表中的整数数量。

(defun isNum (N)
(and (<= N 9) (>= N 0)))

(defun count-numbers (list)
(let ((count 0))
(dolist (item list count)
(cond
((null list) nil)
(((and (<= N 9) (>= N 0))) item)(incf count))
(setq(0 + count))))))

当我运行命令时出现错误 A' is not of the expected typeREAL'(计数'(3 4 5 6 a 7 b))

最佳答案

考虑到您的 cond,我很惊讶它能运行构造不当,您在代码的不必要的副作用生成位中切换到中缀表示法,并且您在 count-numbers 中使用未绑定(bind)变量.假设地,如果它确实运行了,那么这个错误听起来是正确的。您正在对参数进行数字比较(以及非数字输入的错误)​​。

我今天戴上了代码审查帽,所以让我们更深入地了解一下。


Lisp(实际上哪个并不重要,afaik 这适用于 CL、Scheme 和所有杂种)使用 lower-case-snake-case-with-dashes ,而不是 lowerCamelCase用于变量和函数名称。

(defun is-num (n)
(and (<= n 9) (>= n 0)))

Common Lisp 惯例是以 p 结束谓词或 -p而不是以 is- 开头. Scheme 具有(IMO 更好)结束谓词的约定 ?相反

(defun num-p (n)
(and (<= n 9) (>= n 0)))

((and (<= N 9) (>= N 0)))不是你调用函数的方式。你实际上需要使用它的名字,而不仅仅是尝试调用它的主体。这是您尝试运行此代码时会遇到的众多错误之一的来源。

(defun count-numbers (list)
(let ((count 0))
(dolist (item list count)
(cond
((null list) nil)
((num-p item) item)(incf count))
(setq(0 + count))))))

numberp已经存在,并且对其输入进行类型检查,而不是尝试进行数字比较。您可能应该改用它。

(defun count-numbers (list)
(let ((count 0))
(dolist (item list count)
(cond
((null list) nil)
((numberp item) item)(incf count))
(setq(0 + count))))))

((numberp item) item) (incf count))可能不会像您认为的那样做 cond条款。它实际上被视为两个单独的条款;检查是否 itemnumber , 如果是则返回它。第二个尝试检查变量 incf并返回 count如果它的计算结果为 t (它没有,也不会)。你似乎想要的是增加计数器 count当你在列表中找到一个数字时,这意味着你应该把它 incf item 中的子句.

(defun count-numbers (list)
(let ((count 0))
(dolist (item list count)
(cond ((null list) nil)
((numberp item)
(incf count)
item))
(setq (0 + count)))))

(setq (0 + count))由于三个原因是错误的

  • 您似乎又回到了中缀表示法,这意味着那里的第二位实际上是在尝试调用函数 0与变量 +count作为论点。
  • 您没有 setq 的第二部分,这意味着您正在尝试将以上设置为 NIL含蓄地。
  • 实际上你不需要设置任何东西来返回一个值

至此,我们终于有了一段可以正确评估和运行的代码(并且不会抛出您上面提到的错误)。

(defun count-numbers (list)
(let ((count 0))
(dolist (item list count)
(cond ((null list) nil)
((numberp item)
(incf count)
item))
count)))

dolist是一个迭代结构,它为给定列表中的每个元素做一些事情。这意味着您实际上不需要使用 cond 手动测试列表终止.另外,因为 dolist不收集结果,没有理由返回 item给它。您还不必要地隐藏了本地 count您在 let 中声明.

(defun count-numbers (list)
(let ((count 0))
(dolist (item list)
(when (numberp item) (incf count)))
count))

像往常一样,您可以使用更简单的 loop 来完成所有这些工作打电话。

(defun count-numbers (list)
(loop for item in list
when (numberp item) sum 1))

这使计数器隐式化并使您无需手动返回它。事实上,除非这是专门编写你自己的迭代函数的练习,否则 Common Lisp 有一个内置的 count-if。 ,这需要 predicate sequence [some other options]并返回 count sequence 中的项目匹配 predicate .如果你想命名 count-numbers具体来说,出于风格原因,您可以

(defun count-numbers (list) (count-if #'numberp list))

并完成它。


总之,不错的尝试,但请尝试reading uplanguage 上家庭for realzies在提出进一步问题之前。

关于lisp - `A' 不是预期的类型 `REAL',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11414260/

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