我在LISP中定義了一個函數,並且它正確地定義了。但是每當我嘗試打電話時,我都會收到一個錯誤消息,說「變量FACTORIAL未被綁定」。我的LISP函數是一個未綁定的變量嗎?
我已經在OS X和Windows 7上,在LispWorks和Allegro上試過這個。功能是 -
(defun factorial (x)
(if (= 1 x) 1
(* x factorial (- 1 x))))
任何幫助表示讚賞。
我在LISP中定義了一個函數,並且它正確地定義了。但是每當我嘗試打電話時,我都會收到一個錯誤消息,說「變量FACTORIAL未被綁定」。我的LISP函數是一個未綁定的變量嗎?
我已經在OS X和Windows 7上,在LispWorks和Allegro上試過這個。功能是 -
(defun factorial (x)
(if (= 1 x) 1
(* x factorial (- 1 x))))
任何幫助表示讚賞。
它看起來像你錯過了一對括號:
(defun factorial (x)
(if (= 1 x) 1
(* x (factorial (- 1 x)))))
沒有()
周圍factorial
,Lisp的認爲你指的是變量而不是功能。
幾乎 - 我幾乎錯過了'( - 1 x)'。雖然我不知道CL,但我完全可以放棄! – Isaac 2010-08-31 01:34:59
@Isaac Hodes:我也看到了,但我想我會把它作爲OP的練習。 :) – 2010-08-31 01:38:06
在您的代碼的第三行中,您乘以x
次factorial
次1-x
。
首先要注意的是factorial
不是一個變量:它是一個函數。由於Common-Lisp是一個Lisp-2,因子不是作爲一個變量綁定的 - 它被綁定爲一個函數。
您需要調用factorial
函數,其中一個小於x
,而不是x
小於1。
所以:
(defun factorial (x)
(if (= 1 x) 1
(* x (factorial (- x 1)))))
...應該這樣做。
你需要綁定你打算使用括號的所有變量和函數調用,除非你希望它們是符號。關於綁定錯誤,保羅·格雷厄姆在他的書中一個很好的例子:Ansi Common Lisp
一個 你會從Lisp中聽到的是一個符號 沒有價值或者是未綁定的最常見的抱怨。有幾個 不同的問題以這種方式顯示在 中。局部變量,如由let和defun建立的那些 , 僅在 表達式的正文中有效,它們在其中創建。所以 如果我們試圖把這樣一個可變 創建它的讓利外:
> (progn (let ((x 10))
(format t "Here x = ~A.~%" x))
(format t "But now it's gone...~%") x)
可以顯示在您調用它的代碼? – atk 2010-08-31 01:31:57