2010-07-16 14 views
5

tengo el siguiente fragmento de código en mi .emacs:evaluar la expresión antes de que se ponga en lambda

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

Obviamente la variable mode es nulo cuando lambda llega a ejecutar. La pregunta es ¿cómo evalúo mode de tal manera que no entra en una lambda como una variable, sino más bien como un valor en esa variable? En otras palabras, quiero que el mensaje se imprima cuando se ejecuta el gancho.

+1

Sólo una pequeña nota: el "obviamente es nula ..." es malo - * debería * * * no ser así, y Emacs Lisp es uno de muy pocos idiomas donde esto todavía sucede. Se llama alcance dinámico. En relación con esto, busca la forma 'lexical-let' en Emacs, que es un truco que emula el comportamiento más seguro que funcionaría. –

Respuesta

10

Lo que se puede utilizar es 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")))))