Acabo de pasar siglos averiguando qué pasaba con mi código. Funcionó muy bien en las pruebas de unidades de ert, pero falló cuando lo ejecuté en un contexto más amplio. Aquí está un ejemplo de un código que funcionó:¿Por qué el código en with-temp-buffer se queja de la variable void cuando el buffer "primario" tiene una variable local del mismo nombre que he enlazado?
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
Esto imprime z como se esperaba. Ahora estaba escribiendo un modo principal que tenía algunas variables de buffer-local. Uno de estos fue my-var. Este código demuestra mi problema:
(make-local-variable 'my-var)
(setq my-var "y")
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
¿La salida? No hay ninguna, solamente este mensaje de error:
eval-buffer: Symbol's value as variable is void: my-var
En este ejemplo, es fácil ver que la variable local al búfer interfiere de alguna manera con el ligado de forma dinámica mi-var. No fue tan fácil cuando tenía varias pantallas que valían la pena de código :-)
Así que mi pregunta es qué está pasando realmente aquí? Es obvio que el temp-buffer de alguna manera hereda una variable del "padre", pero ¿por qué tiene un valor nulo? Entendería si de alguna manera obtendría el valor "y", pero este comportamiento me parece un error.
PS. Estoy ejecutando el último Aquamacs
Pero todavía no entiendo por qué es nula. Lo creo con: (make-local-variable my-var) y luego le asigno el valor "y": (setq my-var "y"). Así que para cuando llame a la función y la macro with-temp-buffer dentro del valor no debería ser nula. ¿Qué me estoy perdiendo? – auramo
"En otras palabras, solo tiene un enlace en los almacenamientos intermedios en los que se ha establecido explícitamente". <- No lo configuré explícitamente en el temp-buffer creado dentro de la macro con-temp-buffer. El buffer de alguna manera heredó la variable pero no su valor. Además, no quiero crear una variable global si puedo evitar eso. Puedo vivir con esta característica muy bien, solo tengo que recordar nombrar las variables cuidadosamente. Solo me gustaría saber por qué sucede esto. – auramo
En realidad, hay un par de cosas sucediendo aquí en su código, actualizaré mi respuesta. –