2010-07-16 4 views
5

J'ai la pièce de code suivante dans mon .emacs:évaluer l'expression avant qu'il ne soit mis 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"))) 

Il est évident que la variable mode est nulle lorsque lambda arrive à exécuter. La question est de savoir comment j'évalue mode de manière à ne pas entrer dans un lambda comme une variable mais plutôt comme une valeur dans cette variable? En d'autres termes, je veux que le message soit imprimé quand le crochet est exécuté.

+1

Juste un petit mot: votre « évidemment ... est vide » est mauvais - il * devrait * * pas * être de cette façon, et Emacs Lisp est l'une des très rares langues où cela arrive encore. C'est ce qu'on appelle la portée dynamique. En relation avec ceci, cherchez la forme 'lexical-let' dans Emacs, qui est un hack qui émule le comportement de saner qui fonctionnerait. –

Répondre

10

Qu'est-ce que vous pouvez utiliser est 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"))))) 
Questions connexes