EDITAR: Cambié el código de ejemplo después de la primera respuesta porque se me ocurrió una versión simple que plantea las mismas preguntas.Alcance de Lisp común (dinámico frente a léxico)
Actualmente estoy aprendiendo las propiedades de alcance de Common Lisp. Después de pensar que tenía una comprensión sólida, decidí codificar algunos ejemplos de los que podía predecir el resultado, pero aparentemente estaba equivocado. Tengo tres cuestión, cada uno relativo a un ejemplo a continuación:
Ejemplo 1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
de salida:
5
*** - EVAL: variable X has no value
Pregunta: Esto tiene sentido. x tiene un alcance estático y fun2 no tiene forma de encontrar el valor de x sin que se pase explícitamente.
Ejemplo 2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
Salida:
5
5
Pregunta: No entiendo por qué x es repentinamente visible para Fun2 con el valor que se dio fun1, en lugar de tener un valor de 100 ...
Ejemplo 3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
Salida:
5
100
Pregunta: ¿Debo pasar por alto estos resultados desde llamando setf en una variable no declarada es aparentemente indefinido? Esto pasa a ser lo que se espera en mi segundo ejemplo ...
Cualquier idea sería muy apreciada ...
Aquí es mi explicación ingenua Después de jugar un poco ... que me haga saber si estoy cerca .. Exmaple 1: necesita ninguna explicación Ejemplo 2: declarar x como una variable dinámica hace que todas las instancias de x que debe buscarse en tiempo de ejecución en la pila de variables dinámicas, lo que causaría que fun2 heredara el valor de x de fun1, a pesar de no ser una variable dinámica. Ejemplo 3: ni idea ... Supongo que es indefinido –
* Las preguntas planteadas son buenas. * Peticiones * es ** malo. ** –
En lugar de DEFMETHOD, use DEFUN. Un DEFMETHOD no es necesario en estos ejemplos. DEFUN crea una función simple. DEFMETHOD es para funciones genéricas, donde necesita un poco de despacho. –