2010-07-16 68 views
5

之前,我有以下的代碼在我.emacs計算表達式它放在拉姆達

(dolist (mode '(scheme emacs-lisp lisp clojure)) 
    (add-hook 
    (intern (concat (symbol-name mode) "-mode-hook")) 
    (lambda() 
    (progn 
     (run-programming-hook) 
     (message "%s" (concat (symbol-name mode) "-mode"))) 

顯然mode變量是無效的,當拉姆達得到執行。問題是我如何評估mode這樣一種方式,它不會將lambda作爲變量進入,而是作爲該變量的值?換句話說,我希望在鉤子運行時打印消息。

+1

只是快速記:你的「......顯然是無效的」是錯誤的 - 它應該* * *不*是這樣,和Emacs Lisp是這仍然發生的幾種語言之一。它被稱爲動態範圍。與此相關的是,在Emacs中查找'lexical-let'形式,這是一種模擬可以工作的更爲明智的行爲。 – 2010-07-17 22:21:21

回答

10

你可以使用什麼是backquote

(dolist (mode '(scheme emacs-lisp lisp clojure)) 
    (add-hook 
    (intern (concat (symbol-name mode) "-mode-hook")) 
    `(lambda() 
     (run-programming-hook) 
     (message "%s" ,(concat (symbol-name mode) "-mode")))))