2013-04-26 51 views
1

我是新來的口齒不清,並且有一定的麻煩與我的功能不是:Common 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)) 

這thows下一個錯誤:

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

我認爲Lisp是試圖評估while循環我的輸入列表,但

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

作品就好了,我相信,我的功能不相同的C赫克。所以。我不明白爲什麼發生這個錯誤。

回答

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的編輯會爲你做。它增加了您和其他人的可讀性。

+0

或者如果您正在使用的Common Lisp的實現不帶有內置編輯器,我會建議考慮使用Emacs或Vim作爲您的編輯器。兩者都帶有Lisp漂亮的打印功能。你還可以找到一個用Lisp編寫的Lisp漂亮打印機腳本,[這裏](http://www.ccs.neu.edu/home/dorai/scmindent/index.html)。 – Mars 2013-04-28 05:36:08