我的LISP如何作为未绑定的变量?

时间:2010-08-31 01:28:36

标签: lisp common-lisp

我在LISP中定义了一个函数,并且它正确定义。但每当我尝试调用它时,我都会收到错误消息“变量FACTORIAL未绑定”。

我在OS X和Windows 7上,在LispWorks和Allegro上尝试了这个。功能是 -

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

感谢任何帮助。

4 个答案:

答案 0 :(得分:16)

在代码的第三行,您将xfactorial次乘以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)