Pregunta:
En mi archivo .emacs
conf, tengo esta función que agrega un gancho para configurar el compile-command
según el modo. Parece algo como
(defun set-compile-cmd (mode-hook cmd)
(add-hook mode-hook (lambda ()
(set (make-local-variable 'compile-command) cmd))))
Pero aparece un error que dice que el valor del símbolo cmd
es nulo. ¿No debería existir cmd
en el alcance de la lambda también?
Respuesta:
No, no debería, si usa un enlace dinámico. Aquí hay dos opciones (alternativas) que pueden ayudar:
- Utilice enlace léxico. Establezca el
lexical-binding
variable para el archivo. - Use el enlace dinámico (lo que está haciendo ahora, sin duda), pero también sustituya el valor de la variable
cmd
por la variablecmd
en el cuerpolambda
. Puede hacer esto solo si el cuerpo de la función de lalambda
no necesita realmente quecmd
sea una variable cuando se invoca y puede funcionar solo con su valor (su valor en el momento en que la función se agrega al gancho).
Para el n. ° 1 , consulte el nodo Using Lexical Binding
en el manual de Elisp. Esencialmente, tendrá que agregar -*- lexical-binding: t; -*-
al final de la primera línea del archivo.
Para el n. ° 2 , haz esto:
(add-hook mode-hook `(lambda () (set (make-local-variable 'compile-command) ',cmd))))
Para obtener información sobre esto, consulte el nodo Backquote
en el manual de Elisp.
En el caso del # 2, lo que se agrega al gancho es una expresión lambda
textual. Se interpreta (y por tanto se invoca) como una función solo cuando se ejecuta el gancho .
En el caso de # 1, la función (un cierre, en realidad) correspondiente a la expresión lambda
se interpreta como (se entiende que es) una función cuando se agrega al gancho y, por lo tanto, puede incluso ser compilada por bytes.
El cierre contiene un enlace variable de cmd
al valor que tenía cuando se agregó la función al gancho), como parte del código de la función (compilada o no).
Esto significa que cuando se invoca esa función, cualquier código que ejecute tiene acceso a cmd
como una variable en ese momento (no solo un valor). Si realmente no necesita una variable cmd
en ese momento y un valor servirá, y si no le importa la compilación de bytes del código lambda
, entonces el # 1 suele ser adecuado.