Это не ошибка. Было бы полезно прочитать руководство для Правила определения объема для привязок переменных .
Функция, которую вы написали, вызывает set
, которая принимает символ (значение первого аргумента) и меняет его значение на значение второго аргумента. make-zero
, который вы написали, локально связывает x
со своим входным аргументом, поэтому, когда вы передаете символ x
, set изменяет первую найденную привязку для x
, которая оказывается локальной привязкой.
Вот другой пример, скажем, у вас просто было следующее:
(defun print-something (something)
(set 'something "NEW VALUE")
(insert something))
(print-something "OLD") ; inserts "NEW VALUE"
Глядя на этот фрагмент кода, имеет ли смысл, что строка set
меняет локальное значение something
?
Не имеет значения, есть ли глобальная настройка для символа something
.
Другой пример:
(defvar x "some global value") ;# could have used setq here
(let ((x "local binding"))
(set 'x "new value"))
Какую привязку вы бы ожидали изменить в строке set
? Тот, который создан let
или глобальный, созданный defvar
?
Функция, которую вы написали, выполняет (в значительной степени) то же самое, что и let
, вы создаете локальную привязку для переменной, которая отображается перед глобальной.
Если вы хотите передать ссылку на переменную, то единственный безопасный способ сделать это - макрос , который я рекомендую, но не до тех пор, пока вы не освоите основы lisp (b / с макросами определенно сложнее). Тем не менее, не дай мне помешать тебе погрузиться в макросы, если это твоя страсть.
Хорошее введение в программирование Emacs lisp можно найти здесь .
ответ geekosaur хорошо показывает, как вы достигнете того, чего хотите.