我试着学习Lisp(实际上是elisp),我试着编写以下函数作为一个练习项目EulerProblem 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”之前,它在那里不会抱怨,那么为什么这里会出错?
另外,我意识到这个函数实际上可能不正确,但现在我不担心逻辑-我稍后会解决这个问题现在,我只对理解这个错误感兴趣。

最佳答案

不确定这是否解决了您的问题(我手头没有一个elisp解释器),但您缺少一个正确的paren。在第一个“if”语句的末尾,在“sum”之后应该有一个。

  (if (< 4000000 (+ fn1 fn2))
      sum)

而不是:
 (if (< 4000000 (+ fn1 fn2))
      sum

我也认为可能还有其他问题。

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

10-10 13:49