字节编译时死循环
Infinite loop when byte compile
我是 evil-commentary 的作者,不到 200 行的完整源代码可以在 repo 中找到。
基本上我有这样的东西。
(evil-define-operator evil-commentary (beg end type)
"Comment or uncomment region that {motion} moves over."
:move-point nil
(interactive "<R>")
(let ((comment-function
(cdr (assoc major-mode
evil-commentary-comment-function-for-mode-alist))))
(if comment-function (funcall comment-function beg end)
(comment-or-uncomment-region beg end))))
(defun evil-commentary-comment-for-org (beg end)
"Comment function for `org-mode'."
(interactive "r")
(if (and (fboundp 'org-in-src-block-p)
(org-in-src-block-p))
(evil-commentary-do-in-org-src-block beg end
(call-interactively 'evil-commentary))
(comment-or-uncomment-region beg end)))
想法是 evil-commentary
将在 org 文件中调用 evil-commentary-comment-for-org
,如果我们在 src 块中,evil-commentary-comment-for-org
将再次调用 evil-commentary
src-edit
缓冲区(现在有不同的 major-mode
)
设置工作正常,但是当我编译代码时,我得到一个无限循环 evil-commentary
-> evil-commentary-comment-for-org
-> evil-commentary
... Variable binding depth exceeds max-specpdl-size
错误...
我发现如果我在加载 org
后编译代码它会工作,但这不是我想要的,因为如果用户使用旧版本的 [=] 编译,evil-commentary
将停止工作21=] 然后升级它。 (package.el
的缺陷)
谢谢!
问题出在 this line,扩展为:
(org-babel-do-in-edit-buffer
(call-interactively 'evil-commentary))
如果你没有加载org
,字节编译器不知道org-babel-do-in-edit-buffer
是一个宏,无法展开。因此,它只是编译了对一个名为 org-babel-do-in-edit-buffer
.
的(目前未知)函数的调用
当执行到该行时,函数参数首先被求值(就像在任何其他函数调用中一样),然后你就有了无限循环。
尝试在 eval-when-compile
块中要求 org
。
我是 evil-commentary 的作者,不到 200 行的完整源代码可以在 repo 中找到。
基本上我有这样的东西。
(evil-define-operator evil-commentary (beg end type)
"Comment or uncomment region that {motion} moves over."
:move-point nil
(interactive "<R>")
(let ((comment-function
(cdr (assoc major-mode
evil-commentary-comment-function-for-mode-alist))))
(if comment-function (funcall comment-function beg end)
(comment-or-uncomment-region beg end))))
(defun evil-commentary-comment-for-org (beg end)
"Comment function for `org-mode'."
(interactive "r")
(if (and (fboundp 'org-in-src-block-p)
(org-in-src-block-p))
(evil-commentary-do-in-org-src-block beg end
(call-interactively 'evil-commentary))
(comment-or-uncomment-region beg end)))
想法是 evil-commentary
将在 org 文件中调用 evil-commentary-comment-for-org
,如果我们在 src 块中,evil-commentary-comment-for-org
将再次调用 evil-commentary
src-edit
缓冲区(现在有不同的 major-mode
)
设置工作正常,但是当我编译代码时,我得到一个无限循环 evil-commentary
-> evil-commentary-comment-for-org
-> evil-commentary
... Variable binding depth exceeds max-specpdl-size
错误...
我发现如果我在加载 org
后编译代码它会工作,但这不是我想要的,因为如果用户使用旧版本的 [=] 编译,evil-commentary
将停止工作21=] 然后升级它。 (package.el
的缺陷)
谢谢!
问题出在 this line,扩展为:
(org-babel-do-in-edit-buffer
(call-interactively 'evil-commentary))
如果你没有加载org
,字节编译器不知道org-babel-do-in-edit-buffer
是一个宏,无法展开。因此,它只是编译了对一个名为 org-babel-do-in-edit-buffer
.
当执行到该行时,函数参数首先被求值(就像在任何其他函数调用中一样),然后你就有了无限循环。
尝试在 eval-when-compile
块中要求 org
。