gpt4 book ai didi

评估函数时出现 Lisp void-variable 错误

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

我正在尝试学习 Lisp(实际上是 elisp),并且尝试编写以下函数作为练习 Project Euler Problem 2

(defun sumfib (n fn1 fn2 sum)
"Calculate Fibonacci numbers up to 4,000,000 and sum all the even ones"
(if (< 4000000 (+ fn1 fn2))
sum
(if (equal n 3)
(sumfib 1 (+ fn1 fn2) fn1 (+ sum (+fn1 fn2)))
(sumfib (+ n 1) (+ fn1 fn2) fn1 sum)))

当我评估它时,出现以下错误:

Debugger entered--Lisp error: (void-variable fn1)
(+ fn1 fn2)
(< 4000000 (+ fn1 fn2))
...

为什么它不能识别 fn1?如果我尝试将 (+ fn1 fn2) 放在“if”之前,它不会在那里提示,那么为什么这里会出现错误?

此外,我意识到函数实际上可能不正确,但现在我不担心逻辑 - 我稍后会弄清楚。目前,我只想了解此错误。

最佳答案

  1. 您的函数末尾需要一个额外的右括号。
  2. 您需要在第二个 if 的第一个子句中留一个空格:(+fn1 fn2) 应该是 (+ fn1 fn2)。 ELisp 将其读取为将 fn2 传递给名为 +fn1 的函数。

其他一些风格问题:

  1. cond 比嵌套的 ifs 更容易阅读,尤其是使用 ELisp 缩进样式时。
  2. = 是用于比较数字的普通谓词,而不是 equal。尽管 equal 可以工作,但它对读者来说看起来很有趣。 (至少我知道的所有其他 Lisp 都是这样,我可能是错的,因为我也不了解 ELisp。)

以下是我重构函数的方式。

(defun sumfib (n fn1 fn2 sum)
"Calculate Fibonacci numbers up to 4,000,000 and sum all the even ones"
(cond
((< 4000000 (+ fn1 fn2)) sum)
((= n 3) (sumfib 1 (+ fn1 fn2) fn1 (+ sum (+ fn1 fn2))))
(t (sumfib (1+ n) (+ fn1 fn2) fn1 sum))))

我运行了它,它返回了一个答案,但我不知道它是否符合项目欧拉规范。

关于评估函数时出现 Lisp void-variable 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360562/

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