【问题标题】:Exceed evaluation depth when forward function in Emacs Lisp在 Emacs Lisp 中转发函数时超过评估深度
【发布时间】:2015-06-19 04:48:56
【问题描述】:

这只是一个简化的代码,我没有设法工作。我不明白出了什么问题。

(defun enumerate-indicies (func)
    (let ((index 0))
        (while (< index 5)
            (funcall func index)
            (setq index (1+ index)))))

(defun enumerate-multiplied-indicies (func)
    (enumerate-indicies #'(lambda (index)
                            (funcall func (* 10 index)))))

以下测试代码按预期返回10

(defun test/enumerate-indicies ()
    (let ((sum 0))
          (enumerate-indicies #'(lambda (index)
                                    (setq sum (+ sum index))))
    sum))

(test/enumerate-indicies)

但以下原因在我的 Emacs 中导致 error Lisp nesting exceeds max-lisp-eval-depth

(defun test/enumerate-multiplied-indicies ()
    (let ((sum 0))
          (enumerate-multiplied-indicies #'(lambda (index)
                                             (setq sum (+ sum index))))
    sum))
(test/enumerate-multiplied-indicies)

你能给我一个线索吗?这不应该是这里的递归调用,但似乎是。谢谢。

【问题讨论】:

  • 启用词法绑定修复它,虽然我不知道原因。

标签: emacs lisp elisp


【解决方案1】:

lexical-let穿透lambda怎么样?正确答案是100吗?

(defun enumerate-indicies (func)
  (let ((index 0))
    (while (< index 5)
      (funcall func index)
        (setq index (1+ index)))))

(defun enumerate-multiplied-indicies (func)
  (lexical-let ((func func))
    (enumerate-indicies #'(lambda (index)
      (funcall func (* 10 index))))))

(defun test/enumerate-multiplied-indicies ()
  (lexical-let ((sum 0))
    (enumerate-multiplied-indicies #'(lambda (index)
      (setq sum (+ sum index))))
    sum))

(test/enumerate-multiplied-indicies)

【讨论】:

  • 我的 Emacs 24.5.1 没有lexical-let。无论如何,我不明白这种行为的根源。
  • 哦,我明白了。该函数是cl 包的一部分。现在代码开始工作了。无论如何,我在哪里可以找到在我的损坏代码 sn-p 和你的代码中发生了什么的详细信息?我想了解的不仅仅是简单地使用:)
  • 这是我从 legoscialunaryorn 获得的课程的链接:stackoverflow.com/a/24549625/2112489 我不是程序员,只是一个喜欢自定义 Emacs 的爱好者——我发现您的情况与我之前遇到的问题相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多