我是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)))
工作得很好,我确信我的功能会做同样的检查。所以。我不明白这个错误发生在哪里以及为什么会发生。
答案 0 :(得分: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的编辑会为你做这件事。它增加了你和他人的可读性。