Lisp 导致粘液崩溃的Cond声明

Lisp 导致粘液崩溃的Cond声明,lisp,Lisp,函数的第一部分是一个简单的cond语句。它本身可以完美地工作,但当添加函数的其余部分时,会导致意外错误 通过时出现问题: 世博会20 世博会21 该函数适用于任何其他正值n (defun expo (b n) (cond ((= n 0) 1) ((= n 1) b)) (defparameter m (* b b)) (defun expo_iter (a b) (cond ((= a n) b) ((= (+ a 1) n) (* b

函数的第一部分是一个简单的cond语句。它本身可以完美地工作,但当添加函数的其余部分时,会导致意外错误

通过时出现问题: 世博会20 世博会21 该函数适用于任何其他正值n

(defun expo (b n)
  (cond ((= n 0) 1)
        ((= n 1) b))
  (defparameter m (* b b))
  (defun expo_iter (a b)
    (cond ((= a n) b)
          ((= (+ a 1) n) (* b (sqrt m)))
          ((expo_iter (+ a 2) (* b m)))))
  (expo_iter 2 m)

当expo 2 0“lisp连接意外丢失,连接被远程对等方断开。”以前从未出现过此错误,有什么想法吗?

此功能有很多问题

初始条件几乎肯定是格式错误的,因为它根本不起任何作用。也许应该。 有一个缺少的闭合参数,我认为是剪切粘贴错误。 除非您真的知道自己在做什么,否则不要在顶级之外使用defparmeter、defvar或defcontent。相反,使用let。 除非你真的知道自己在做什么,否则不要在顶级之外使用defun。而是使用标签或flet。 局部函数有一个与全局函数的一个参数同名的参数,这很令人困惑,虽然我也经常这样做,但这说明我的程序有一些不好的地方,而不是说它是好的。 非顶级defun&c的使用让它看起来像是从Scheme翻译过来的,很糟糕,也许?类似的计划虽然不那么残忍,但仍然无法终止


然后,如果您真正考虑函数的作用,您将看到为什么它无法终止,如果尾部调用没有被消除,那么它将很快导致堆栈溢出,或者如果尾部调用被消除,那么它最终将由于内存耗尽而死亡,因为考虑了bignum。想想递归的基本情况是什么。垃圾箱应该做什么?

缺少右括号。这个代码根本不起作用。