带有递归Lisp函数的无效函数警告

时间:2014-03-07 06:06:01

标签: lisp emacs23

我在Lisp上看these tutorials,到目前为止我一直在跟踪。但是,当我尝试评估此功能时,

(defun tailfact (n &optional (intermediate 1))
  (if (= n 1)
    (return-from tailfact intermediate))
  (tailfact (1 - n) (* n intermediate)))

(tailfact 5)

我收到Invalid function警告(我在Emacs中运行)。不知道该怎么做,或者如何解决它。

1 个答案:

答案 0 :(得分:2)

你不小心在1-内写了一个空格(这是一个从给定数字中减去1的函数)。删除该空格(即使用(1- n)而不是(1 - n)),然后重试。

此外,Emacs Lisp没有return-from。只需说出intermediate而不是(return-from tailfact intermediate)。您必须在tailfact表达式中移动if调用,作为else子句。

哦,在我的测试中,我发现Common Lisp和Emacs Lisp之间存在另一个不同点:后者不支持可选参数的默认值,它总是使用nil。所以这是将代码移植到elisp的一种方法:

(defun tailfact (n &optional intermediate)
  (let ((intermediate (or intermediate 1)))
    (if (= n 1)
        intermediate
      (tailfact (1- n) (* n intermediate)))))

但是,让我成为第一个同意Rainer评论的人。如果您正在学习Common Lisp资源,那么您真的应该使用Common Lisp实现。我听说SLIME是一个非常棒的Emacs模式,用于集成主要的CL实现,包括SBCL(可能是最常用的CL实现之一)。