elisp – Alcance en lambda

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:

  1. Utilice enlace léxico. Establezca el lexical-binding variable para el archivo.
  2. Use el enlace dinámico (lo que está haciendo ahora, sin duda), pero también sustituya el valor de la variable cmd por la variable cmd en el cuerpo lambda . Puede hacer esto solo si el cuerpo de la función de la lambda no necesita realmente que cmd 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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım