loops - Enlazado de Lisp común en macro de bucle
common-lisp let (1)
Quiero volver a vincular una variable especial dentro de un bucle. Ahora, normalmente, esto se logra usando un let
.
(let ((*read-eval* nil))
(do-something-here))
Pero dado que la macro de loop
tiene estas cláusulas agradables, pensé que podría hacerlo allí. La expresión (macroexpand ''(loop with *read-eval* = nil))
termina expandiendo el enlace a let
, por lo que definitivamente funcionará específicamente en mi implementación. Pero no puedo encontrar nada en el estándar que indique que este es un comportamiento estandarizado. Entonces, supongo, mi pregunta es esta:
(loop with *read-eval* = nil
for i from 1 to 10
do (something-involving-the-read-function))
¿Se requieren implementaciones conformes para modificar la variable *read-eval*
, o existe el riesgo de que puedan crear una nueva variable léxica del mismo nombre?
*read-eval*
es una variable especial global. No hay forma de deshacer eso, es decir, crear un enlace léxico local para ello.
with
cláusula se describe como el uso de enlaces (en oposición a la mera configuración ) lo que significa que, de hecho, una vez que se complete el ciclo, volveremos al valor original (para responder a la pregunta de @ joshua-tailor).
Pensemos racionalmente (loop with foo = nil ...)
definitivamente establece un enlace para foo
. Entonces, para (loop with *read-eval* = nil ...)
no establecer ese enlace, la implementación tiene que verificar (en macroexpansión o tiempo de compilación) si *read-eval*
será una variable dinámica en tiempo de ejecución. Esto suena loco