Я потратил целую вечность на выяснение того, что не так с моим кодом. Он отлично работал в модульных тестах 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