我在LISP中定义了一个函数,并且它正确定义。但每当我尝试调用它时,我都会收到错误消息“变量FACTORIAL未绑定”。
我在OS X和Windows 7上,在LispWorks和Allegro上尝试了这个。功能是 -
(defun factorial (x)
(if (= 1 x) 1
(* x factorial (- 1 x))))
感谢任何帮助。
答案 0 :(得分:16)
在代码的第三行,您将x
次factorial
次乘以1-x
。
首先要注意的是factorial
不是变量:它是一个函数。由于Common-Lisp是一个Lisp-2,因此factorial不作为一个变量绑定 - 它作为一个函数绑定。
您需要在factorial
之上调用x
函数,而不是x
小于(defun factorial (x)
(if (= 1 x) 1
(* x (factorial (- x 1)))))
。
所以:
{{1}}
......应该这样做。
答案 1 :(得分:5)
看起来你错过了一组括号:
(defun factorial (x)
(if (= 1 x) 1
(* x (factorial (- 1 x)))))
如果没有()
factorial
,Lisp认为你指的是变量而不是函数。
答案 2 :(得分:1)
要完成@Isaac Hodes的答案,这表明CL中有明确的2个namspace用于函数和变量。如果你在计划中,你不会有同样的错误。您可以阅读更多here。
答案 3 :(得分:0)
您需要绑定要与括号一起使用的所有变量和函数调用,除非您希望它们是符号。关于未绑定的错误, Paul Graham 在他的书中有一个很好的例子:Ansi Common Lisp
最常见的抱怨之一 你会听到Lisp是一个符号 没有价值或没有约束力。一些 明显的问题表现在 这条路。局部变量,像那些 由let和defun建立,是 仅在体内有效 表达它们的位置。所以 如果我们试图引用这样一个变量 在创造它的let之外:
> (progn (let ((x 10))
(format t "Here x = ~A.~%" x))
(format t "But now it's gone...~%") x)