cond语句导致粘液崩溃

时间:2019-08-03 13:27:56

标签: lisp

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

通过时出现问题: (博览会2 0) (博览会2 1) 该函数对于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连接意外丢失,连接被远程对等断开。'以前从来没有这个错误,有什么想法吗?

1 个答案:

答案 0 :(得分:3)

此功能有很多问题。

  • 几乎可以肯定开头的cond格式不正确,因为它根本不执行任何操作。可能应该。
  • 有一个丢失的封闭括号,我认为这是剪切和粘贴错误。
  • 除非您真的知道在做什么,否则不要在顶层使用defparameter(或defvardefconstant)。而是使用let
  • 除非您真的知道在做什么,否则请不要在顶层使用defun。而是使用labels(或flet)。
  • local函数的参数与global函数的参数之一具有相同的名称,这很令人困惑(尽管我也经常这样做,这对我的程序有不好的影响,不是可以的)。 / li>

使用非顶级defun&c使得它看起来好像是从Scheme转换而来的,很糟糕吗?与Scheme相当的不会那么残酷,但仍然无法终止

然后,如果您实际上考虑该函数的功能,您将看到它为何无法终止的原因,并且如果不消除尾部调用,将会很快导致堆栈溢出,或者最终会死亡通过内存耗尽,因为bignum会检查是否存在。只需考虑一下递归的基本情况是什么。垃圾cond应该做什么?