1

我是 lisp 的新手,我的功能有些问题:

(setf (symbol-function 'reduce-our)
    #'(lambda(new-expression)
            (setf expression nil)
              (loop while (not (equal new-expression expression)) do
                        (setf expression new-expression)
                        (setf new-expression (reduce-once-our expression))
                        (if (not (equal 'new-expression 'expression))
                            (format t " ==> ~A Further reductions are impossible.~%"
                             new-expression)
            new-expression))))

(reduce-our '(^ x => x))

这将引发下一个错误:

Error: The value ^ is not of the expected type NUMBER.

我认为 lisp 正在尝试在 while 循环中评估我的输入列表,但是

(not (equal nil '(^ x => x)))

工作得很好,我相信我的功能也会做同样的检查。所以。我不明白在哪里以及为什么会发生此错误。

4

1 回答 1

3

您确定此函数中发生错误吗?您应该查看回溯。

此外:

(setf (symbol-function 'reduce-our)
   #'(lambda (new-expression)
      ...))

通常写为

(defun reduce-our (new-expression)
   ...)

然后:

(setf (symbol-function 'reduce-our)
  #'(lambda(new-expression)
      (setf expression nil) ...

变量在哪里expression引入?它是未声明的。设置值不会声明变量。

然后:

while (not (foo ...))

只是

until (foo ...)

(if (not (foo)) a b)

(if (foo) b a)

另外:改善缩进。Lisp 中的编辑器会为你做这件事。它增加了您和其他人的可读性。

于 2013-04-26T09:09:53.307 回答