EVAL:Lisp 中的未定义函数 NIL

EVAL: undefined function NIL in Lisp

我正在尝试编写一个名为 calculate 的函数,它获取一个列表作为输入,并计算它的值(用作 lambda 演算缩减器)。

这是我的代码:

(defun substitue(x y z)
  (cond ((atom z) (cond ((eq z y) x)
                        (T z)))
        (T (cons (substitue x y (car z))
                 (substitue x y (cdr z))))))

(defun substitute-and-eval(x y z)
  (eval (substitue x y z)))

(defun calculate(l)
  (cond ((eq l nil) nil)
        ((atom l) (eval l))
        (T (substitute-and-eval (calculate (cdr l))
                                (calculate (car l))
                                l))))

但是当我在 Lisp 中调用以下行时,出现错误:

(calculate '((lambda (x) (+ x 2))
             (lambda (y) (y))
             ((lambda (z) (+ z 4)) 3)))

错误:

EVAL: undefined function NIL

所以我追查了代码,没有找到我在nil上递归调用eval的地方,所以我找不到问题所在。我也不确定我的计算函数是否正确执行了它应该执行的操作。由于我是 Lisp 的新手,我将不胜感激任何帮助。

如果我们在((lambda (z) (+ z 4)) 3)上调用calculate,它会在上面的cdr上调用calculate,即(3)

然后是对(substitute-and-eval nil 3 '(3))的调用。然后尝试评估 (nil)...

使用步进器很容易找到错误的调用,请参阅 STEP