Recursion Elisp递归最大深度

Recursion Elisp递归最大深度,recursion,emacs,elisp,Recursion,Emacs,Elisp,我有一个简短的问题。我理解递归。我也理解为什么需要实现递归的深度限制。我的问题涉及显示最大深度误差的随机性 考虑以下方法,该方法只需将1中的所有数字与传入的值相加: (defun sum (x) (cond ((= x 0) 0) (t (+ x (sum (- x 1)))))) 如果我打电话: (sum 50) (sum 100) 我得到: 1275 如果我打电话: (sum 50) (sum 100) 我得到: Debugger entered--Lisp er

我有一个简短的问题。我理解递归。我也理解为什么需要实现递归的深度限制。我的问题涉及显示最大深度误差的随机性

考虑以下方法,该方法只需将1中的所有数字与传入的值相加:

(defun sum (x)
  (cond
   ((= x 0) 0)
   (t (+ x (sum (- x 1))))))
如果我打电话:

(sum 50)
(sum 100)
我得到:

1275
如果我打电话:

(sum 50)
(sum 100)
我得到:

Debugger entered--Lisp error: (error "Lisp nesting exceeds `max-lisp-eval-depth'")
这很好,但是现在当我关闭调试器并调用:

(sum 50)
对于
(sum 100)
,我收到与上述相同的错误消息

为什么错误消息看起来不一致?我会假设,在我将值返回到50之后,它会像之前一样正常计算。有什么标志我需要重置吗?也许我只是误解了错误信息。任何帮助都将不胜感激


编辑:我忘了补充一点,如果我退出Emacs并重新打开它,我可以再次计算50作为参数的值,但是一旦我尝试100的值并得到错误,我就不能再使用50。

调试器*缓冲区与其他任何缓冲区一样是一个缓冲区。因此,当您使用窗口移动操作切换到另一个缓冲区时,它对您处于调试会话中这一事实没有影响

您可以在modeline中看到,其中显示主模式名称的部分被方括号包围(如果您在几个这样的
递归编辑
s中,则可能有几个这样的括号)


您可以通过点击
*调试器*
缓冲区中的
c
(表示“继续”)或
q
退出调试会话。您也可以像任何其他递归编辑一样退出它,例如按ESC(
键盘escape quit
),或者您也可以使用C-](
中止递归编辑
)。

您可以通过使用
Emacs-Q
(无初始文件)启动Emacs来重现这一点吗?后一部分(arg为50时出错)似乎不正确。是的,只是尝试了一下。它最初工作了50,然后我用100调用它,得到错误消息,把它退回到50,仍然得到错误信息。除非这里有人提供解释或解决方案,请考虑提交Emacs Bug:<代码> M X报告Emacs Bug < /代码>。Emacs开发人员会让您知道这是一个bug还是一个设计缺陷(即使是不情愿的,即设计限制)。如果它是一个bug,他们甚至会尝试修复它。你真的退出了调试器吗?否则,它似乎停留在那个评估级别上。我不知道您绑定了什么,但我猜是
ace window
或类似的东西。那不是;t退出调试器,请在调试器窗口中尝试
q
,或从其菜单中选择退出。您可以使用
C-hk
-x0
BTW检查您在那里调用的函数