我在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中运行)。不知道该怎么做,或者如何解决它。
答案 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实现之一)。