РЕДАКТИРОВАТЬ: Я изменил пример кода после первого ответа, потому что я придумал простую версию, которая вызывает те же вопросы.
В настоящее время я изучаю свойства области видимости Common Lisp. После того, как я подумал, что у меня есть твердое понимание, я решил написать несколько примеров, по которым я мог бы предсказать результат, но, очевидно, я ошибался. У меня три вопроса, каждый из которых относится к приведенному ниже примеру:
Пример 1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Вывод:
5
*** - EVAL: variable X has no value
Вопрос: Это имеет смысл. x имеет статическую область видимости, и fun2 не имеет возможности найти значение x без его явной передачи.
Пример 2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Вывод:
5
5
Вопрос: Я не понимаю, почему x внезапно становится видимым для fun2 со значением, которое ему дал fun1, вместо того, чтобы иметь значение 100 ...
Пример 3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Вывод:
5
100
Вопрос: Следует ли игнорировать эти результаты, поскольку вызов setf для необъявленной переменной явно не определен? Это именно то, что я ожидал во втором примере ...
Любое понимание будет очень признательно ...