2013-01-02 71 views
1

工作,我wan't以實現Elisp閉合行爲,這裏是代碼:爲什麼此代碼不能使用Emacs,口齒不清

(setq lexical-binding t) 
(setq var 3) 
(require 'cl) 
(defun foo (n) 
    #'(lambda (i) 
    (incf n i))) 
(defvar bar (foo var)) 
(funcall bar 1) 

我想要得到的是,每次我運行EXPR :(funcall bar 1)它會將表達式的結果增加1。我不知道爲什麼它不能工作,有人能解釋給我嗎? 我發現在How do I do closures in Emacs Lisp?類似的問題,但我無法理解這一點。我的Emacs版本是24.2.1,似乎支持lexical scoping

+1

每次評估'(funcall bar 1)',你都會得到序列中的下一個數字(從4開始)。你的代碼確實創建了一個閉包。你期待'var'改變價值嗎? (通過Emacs 24.1驗證) –

+0

@Trey Jackson我得到了'setq:Symbol作爲變量的值爲void:n'的錯誤,它不能在我的Emacs中工作,我不希望'var'改變,I只是想看看如何使關閉工作。它在你的Emacs中有效嗎? – toolchainX

+0

是啊,該代碼工作是我的Emacs(24.1),我只是剪切/粘貼/再次evaled它。 –

回答

1

lexical-binding變量是相當特殊的,我強烈推薦它從不使用setq。通過-*- lexical-binding: t -*-在第一行的註釋只定義它(和評論纔會生效後,你再次訪問相應的文件)。

+0

你的意思是'; - * - 詞法綁定:t - * - '在第一行? – toolchainX

+0

或多或少,是的。第一行通常應該看起來像';;; --- '所以只需在描述之後添加' - * - 詞法綁定:t - * - '。 – Stefan