Elisp递归最大深度

问题描述 投票:2回答:1

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

考虑以下方法,它只是将所有数字从1添加到传入的值:

(defun sum (x)
  (cond
   ((= x 0) 0)
   (t (+ x (sum (- x 1))))))

如果我打电话:

(sum 50)

我明白了:

1275

如果我打电话:

(sum 100)

我明白了:

Debugger entered--Lisp error: (error "Lisp nesting exceeds `max-lisp-eval-depth'")

这没关系,但现在我解雇调试器并调用:

(sum 50)

我得到与(sum 100)相同的错误消息。

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

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

recursion emacs elisp
1个回答
1
投票

*Debugger*缓冲区就像任何其他缓冲区一样。因此,当您使用窗口移动操作切换到另一个缓冲区时,它对您在调试会话中的事实没有影响。

您可以在模式行中看到显示主模式名称的部分被方括号括起来(如果您在几个这样的recursive-edits中,可能会有几个这样的括号)。

您可以通过在c缓冲区中点击q(表示“Continue”)或*Debugger*来退出调试会话。您也可以像任何其他递归编辑一样退出,例如按ESC ESC ESC(keyboard-escape-quit)或者您也可以使用C-](abort-recursive-edit)。

© www.soinside.com 2019 - 2024. All rights reserved.