在 Emacs Lisp 中执行前向函数时超出评估深度
Exceed evaluation depth when forward function in Emacs Lisp
这里只是截取的简化代码,我还没有成功。我不明白哪里错了。
(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)))))
下面的测试代码returns 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)
你能给我一个线索吗?这不应该是这里的递归调用,但似乎是。谢谢。
用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)
这里只是截取的简化代码,我还没有成功。我不明白哪里错了。
(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)))))
下面的测试代码returns 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)
你能给我一个线索吗?这不应该是这里的递归调用,但似乎是。谢谢。
用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)