Emacs 在将表达式放入lambda之前对其求值

Emacs 在将表达式放入lambda之前对其求值,emacs,lisp,elisp,Emacs,Lisp,Elisp,我的.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"))) 显然

我的
.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")))
显然,当lambda执行时,
mode
变量无效。问题是我如何评估
模式
,使其不作为变量进入lambda,而是作为该变量中的值?换句话说,我希望钩子运行时打印消息。

您可以使用的是:

请注意:您的“显然……是无效的”是错误的——不应该是这样,Emacs Lisp是少数仍然存在这种情况的语言之一。这叫做动态范围。与此相关,请在Emacs中查找
词法let
表单,这是一种模仿正常行为的黑客行为。
(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")))))