оцените выражение перед тем, как поместить его в лямбду - PullRequest
5 голосов
/ 16 июля 2010

В моем .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 таким образом, чтобы оно не попадало в лямбду как переменную, а скорее как значение этой переменной?Другими словами, я хочу, чтобы сообщение было напечатано при запуске ловушки.

1 Ответ

10 голосов
/ 16 июля 2010

То, что вы можете использовать, это обратная цитата :

(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")))))
...