2010-07-16 67 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")))))