2015-06-19 92 views
2

這裏只是一個簡化的代碼,我沒有設法工作。我不明白什麼是錯的。在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))))) 

下面的測試代碼返回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) 

請您給我的線索?這不應該是一個遞歸調用,但似乎是這樣。謝謝。

+0

啓用詞法綁定可以修復它,但我不知道原因。 – xuchunyang

回答

2

如何使用lexical-let來穿透lambda?是正確答案?

(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) 
+0

我的Emacs 24.5.1沒有'lexical-let'。無論如何,我不明白這種行爲的根源。 – zweibaranov

+0

哦,我明白了。該函數是'cl'包的一部分。代碼現在開始工作。無論如何,我在哪裏可以找到詳細信息在我的破解代碼段和你的代碼中發生了什麼?我想了解,不只是簡單地使用:) – zweibaranov

+0

這裏是我從* legoscia *和* lunaryorn *收到的教訓的鏈接:http://stackoverflow.com/a/24549625/2112489我不是一個程序員交易,只是喜歡定製Emacs的業餘愛好者 - 我認識到您的情況與之前遇到的問題類似。 – lawlist