我不时会收到“嵌套超过`max-lisp-eval-depth'”的错误。
如果您评估,可以收到错误:
(defun func ()
(func))
(func)
但是,在这种情况下,emacs仍然保持响应。
答案 0 :(得分:8)
立即补救措施可以是简单地增加最大值。它的默认值是500,但您可以将它设置为10000,如下所示:
(setq max-lisp-eval-depth 10000)
但这通常不是一个好主意,因为你遇到嵌套的事实首先超过了'max-lisp-eval-depth'错误,这表明你的某些部分代码占用了太多的堆栈空间。但至少暂时增加最大值可以帮助您分析问题,而不会一遍又一遍地收到相同的错误消息。
答案 1 :(得分:4)
基本上,这意味着一些Lisp代码使用的堆栈比Emacs编译得允许更多。
实际上,它是Lisp代码中的一个错误的标志。正确编写的代码应该避免深深嵌套,即使算法和输入数据是“正确的”;但更常见的是,它是由于未处理的角落情况或意外输入而发生的。
如果你很幸运,重复的控制-G按键可以让你摆脱难题,而不会杀死Emacs。
如果您正在开发Emacs Lisp代码,您可能需要巧妙地调整max-lisp-eval-depth
的值,以帮助找到代码可能需要强化或修复错误的位置。当然,将debug-on-error
设置为t
应该会向您展示堆栈的回溯。
答案 2 :(得分:0)
Emacs有一个Lisp评估员。此求值程序解释lisp函数。调用函数时,求值程序会在堆栈上添加一个帧,以便记住最后一个状态。为了限制lisp解释器的内存使用,可以将其配置为不要进行超过max-lisp-eval-depth
次调用。这里depth
是评估堆栈的深度。