Область видимости Common Lisp (динамическая vs лексическая)

РЕДАКТИРОВАТЬ: Я изменил пример кода после первого ответа, потому что я придумал простую версию, которая вызывает те же вопросы.

В настоящее время я изучаю свойства области видимости 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 для необъявленной переменной явно не определен? Это именно то, что я ожидал во втором примере ...

Любое понимание будет очень признательно ...

10
задан Rainer Joswig 17 October 2011 в 07:40
поделиться