Почему код в with-temp-buffer жалуется на переменную void, если в «родительском» буфере есть локальная переменная с тем же именем, что и я привязал?

Я потратил целую вечность на выяснение того, что не так с моим кодом. Он отлично работал в модульных тестах ert, но не работал, когда я запускал его в более крупном context. Вот пример кода, который работал:

(defun func (my-var)
  (with-temp-buffer
    (message my-var)))

(func "z")

Это печатает z, как и ожидалось. Теперь я писал основной режим, в котором были некоторые локальные для буфера переменные. Одной из них была my-var. Этот код демонстрирует мою проблему:

(make-local-variable 'my-var)
(setq my-var "y")

(defun func (my-var)
  (with-temp-buffer
    (message my-var)))

(func "z")

Результат? Нет, только это сообщение об ошибке:

eval-buffer: Symbol's value as variable is void: my-var

В этом примере легко увидеть, что локальная переменная буфера каким-то образом мешает динамически привязанной переменной my-var. Это было не так просто, когда я хотя у меня было несколько экранов кода: -)

Итак, мой вопрос: что на самом деле здесь происходит? Очевидно, что временный буфер каким-то образом наследует переменную от «родительского» буфера, но почему у него пустое значение? Я бы понял, если бы он каким-то образом получил значение «y», но такое поведение мне кажется ошибкой.

PS. Я использую последнюю версию Aquamacs

7
задан auramo 25 January 2012 в 20:14
поделиться