【问题标题】:Lisp - is not of the expected type NUMBERLisp - 不是预期的类型 NUMBER
【发布时间】:2012-01-10 23:06:18
【问题描述】:

我在 Lisp 代码中收到以下错误:

value (PROBLEM1 (+ N 1)) is not of the expected type NUMBER.

代码的目的是将所有能被 3 或 5 整除的数加起来,最大为 1000。

(defun problem1 (n)
  (if (< n 1000)
      (if (or (= 0 (mod n 3)) (= 0 (mod n 5))) 
      (apply '+ '(n (problem1 (+ n 1)))) 
      (apply '+ '(0 (problem1 (+ n 1)))))
   0))

我意识到错误可能是因为问题 1 返回了一个列表 - 但是当我在脑海中跟踪值时,该函数应该可以正常工作。因此,如果我误用(或遗漏)撇号,有人可以向我解释吗?

【问题讨论】:

  • 对不起,没有真正的帮助,但我正在学习 lisp (clojure),当我遇到这样的事情时,我会开始解构 repl 中的内容,直到我找出哪里出错了。
  • 我相信问题在于,在最后的递归调用中,我会有类似:(apply '+ (3 (3))... 但我不确定如何解决该列表。
  • 只是扩展我的答案,但问题1 没有返回列表。它要么返回 0(如果最外面的if 的条件是nil),或者将+ 应用于列表的结果,该列表永远不会是列表。
  • 这里没有理由一开始就使用 APPLY。只需拨打 +。

标签: lisp common-lisp


【解决方案1】:

与其错过',不如说你有太多了。当你写

(apply '+ '(n (problem1 (+ n 1))))

您正在尝试将+ 应用于包含符号n 和未评估列表(problem1 (+ n 1)) 的列表。这是因为您引用了参数列表,而' 阻止了评估。你真正想要的是使用list,例如

(apply '+ (list n (problem1 (1+ n))))

【讨论】:

  • 或者只是(+ n (problem (1+ n))),我不太明白在这里申请的必要性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2021-09-08
  • 2017-12-28
相关资源
最近更新 更多