3

我的 clojure repl 开始抛出“变量绑定深度超过 max-specpdl-size”错误,我被扔进了调试器。

我目前正在通过 clojure-jack-in 访问粘液,并且正在对合理大小的数据集执行缩减。一些谷歌搜索让我相信这个错误是因为我生成了太多的临时变量,特别是:

用户选项:max-specpdl-size

此变量定义了在 Emacs 发出错误信号之前允许的局部变量绑定和展开保护清理(请参阅从非本地退出清理)总数的限制(数据“变量绑定深度超过 max-specpdl-size”)。

这个限制,以及当它被超过时的相关错误,是 Lisp 避免对定义不明确的函数进行无限递归的一种方式。max-lisp-eval-depth 提供了嵌套深度的另一个限制。见评估。

默认值为 1000。进入 Lisp 调试器会增加该值,如果剩余空间很小,以确保调试器本身有执行空间。 在这里找到

我对调试 clojure-swank/slime 的经验很少,所以我希望有人能提供帮助。

编辑: 我正在使用带有 emacs 24 和 clojure 1.3.0 的 clojure-mode 1.11.4,我没有安装 swank-clojure,我使用的是通过 clojure-jack-in 与 clojure-mode 捆绑在一起的一个我之前解释过。

4

1 回答 1

0

以防万一有人正在寻找这个问题的可能答案......

正如所概述的,这个错误通常意味着一个问题,但并非总是如此。在您拥有大型数据结构或使用某些 emacs 功能(例如 defadvice)的情况下,您可以合法地超过默认深度设置,这可能会导致深度绑定等。您可以增加深度并查看是否有帮助(例如,加倍),但在这种情况下,它可能是一个错误。

swank-clojure 的问题之一是它与旧版本的 slime 紧密耦合。这意味着粘液中的改进和错误修复不可用。正是由于这种紧密的结合,coljure 社区已经从使用 slime 转向使用 cider,我强烈建议改用 cider 而不是 slime 和 swank-clojure。

于 2015-10-11T06:56:30.777 回答