Почему setq и set quote действуют по-разному в переменных с привязкой let с лексической областью действия?

14

У меня была ошибка в одном из моих расширений, которая в итоге оказалась вызвана setнеработоспособностью, как я ожидал:

;; -*- lexical-binding: t -*-

(let ((a nil))
  (setq a t)
  (print a))


(let ((a nil))
  (set 'a t)
  (print a))

при запуске с emacs -Q --batch -l temp.elпринтами:

t

nil

Это кажется мне очень странным. У меня сложилось впечатление, что (setq a b)это стенография для (set 'a b). В чем дело?

dshepherd
источник

Ответы:

14

Это документированное поведение. (Значительно улучшенное) объяснение в руководстве по Emacs 25.1 elisp следующее:

Обратите внимание, что в отличие от динамических переменных, которые связаны с самим объектом символа, связь между лексическими переменными и символами присутствует только в интерпретаторе (или компиляторе). Следовательно, функции, которые принимают символьный аргумент (например, «symbol-value», «boundp» и «set»), могут только извлекать или изменять динамическое связывание переменной (т. Е. Содержимое ячейки значения ее символа).

C-hig (elisp) Lexical Binding

Phils
источник