2010-07-16 8 views
5

Ho il seguente pezzo di codice nel mio .emacs:valutare l'espressione prima di essere messo in 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"))) 

Ovviamente la variabile mode è nullo quando lambda arriva a eseguire. La domanda è: come valuto mode in modo che non entri in una lambda come variabile ma piuttosto come un valore in quella variabile? In altre parole, voglio che il messaggio venga stampato quando viene eseguito il hook.

+1

Solo una breve nota: il tuo "ovviamente ... è vuoto" è sbagliato - è * dovrebbe * * non * essere in questo modo, ed Emacs Lisp è una delle pochissime lingue in cui ciò accade ancora. Si chiama dynamic scope. In relazione a ciò, cerca il modulo 'lexical-let' in Emacs, che è un hack che emula il comportamento del saner che avrebbe funzionato. –

risposta

10

Che cosa si può utilizzare è 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"))))) 
Problemi correlati