2010-08-31 79 views
9

我在LISP中定義了一個函數,並且它正確地定義了。但是每當我嘗試打電話時,我都會收到一個錯誤消息,說「變量FACTORIAL未被綁定」。我的LISP函數是一個未綁定的變量嗎?

我已經在OS X和Windows 7上,在LispWorks和Allegro上試過這個。功能是 -

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x factorial (- 1 x)))) 

任何幫助表示讚賞。

+1

可以顯示在您調用它的代碼? – atk 2010-08-31 01:31:57

回答

5

它看起來像你錯過了一對括號:

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x (factorial (- 1 x))))) 

沒有()周圍factorial,Lisp的認爲你指的是變量而不是功能

+0

幾乎 - 我幾乎錯過了'( - 1 x)'。雖然我不知道CL,但我完全可以放棄! – Isaac 2010-08-31 01:34:59

+3

@Isaac Hodes:我也看到了,但我想我會把它作爲OP的練習。 :) – 2010-08-31 01:38:06

16

在您的代碼的第三行中,您乘以xfactorial1-x

首先要注意的是factorial不是一個變量:它是一個函數。由於Common-Lisp是一個Lisp-2,因子不是作爲一個變量綁定的 - 它被綁定爲一個函數。

您需要調用factorial函數,其中一個小於x,而不是x小於1。

所以:

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x (factorial (- x 1))))) 

...應該這樣做。

1

要完成@Isaac Hodes的答案,這表明CL中有明顯的2個namspace用於函數和變量。如果你在計劃中,你不會有同樣的錯誤。你可以閱讀更多here

+1

它仍然是錯誤的,因爲你仍然需要遞歸調用的括號,但它會以一個更有趣的方式錯誤。 – 2010-08-31 16:44:09

+2

是的,就是我說過的「你不會有同樣的錯誤」 – mathk 2010-09-01 17:56:47

0

你需要綁定你打算使用括號的所有變量和函數調用,除非你希望它們是符號。關於綁定錯誤,保羅·格雷厄姆在他的書中一個很好的例子:Ansi Common Lisp

一個 你會從Lisp中聽到的是一個符號 沒有價值或者是未綁定的最常見的抱怨。有幾個 不同的問題以這種方式顯示在 中。局部變量,如由let和defun建立的那些 , 僅在 表達式的正文中有效,它們在其中創建。所以 如果我們試圖把這樣一個可變 創建它的讓利外:

> (progn (let ((x 10)) 
        (format t "Here x = ~A.~%" x)) 
        (format t "But now it's gone...~%") x) 
相關問題