Какая разница между setqи defvarв Emacs lisp?
Я вижу обычную версию этого вопроса на lisp по адресу /programming/3855862 . Они одинаковые в Элиспе?
Какая разница между setqи defvarв Emacs lisp?
Я вижу обычную версию этого вопроса на lisp по адресу /programming/3855862 . Они одинаковые в Элиспе?
Ответы:
Вы должны задать Emacs этот вопрос: C-h iвыберите руководство Elisp ( m Elisp) и поищите в индексе «defvar» ( i defvar). Это приведет вас к узлу Определение переменных .
Emacs сообщает вам, что defvarпозволяет присоединить строку документа и что, если переменная уже имеет значение, она ничего не делает .
Он также сообщает вам об использовании defvarс значения не должны быть назначены: (defvar foo). Он говорит вам, что это объявляет переменную для динамической области видимости .
setq не имеет ни одного из этих свойств.
defvarи setqпохожи, но не совсем одинаковы, в Emacs Lisp и Common Lisp.
defvar, это глобальная переменная (как в императивном стиле программирования) и соглашение для настройки, в то время как setq больше похож на привязку let в функциональных языках программирования (с правилом динамической / лексической области видимости, зависящим от того, какой режим глобальной области видимости активен). .......)
setqустанавливает значение переменной, независимо от того, является ли переменная (вхождение) локальной. defvarобъявляет переменную как глобальную. (Это может быть также «локальный буфер»:. local-variable-p) Вхождение var, связанное как функция arg, или let«local» в обычном смысле. Если переменная, связанная с letи т. Д., Является глобальной (или локальной для буфера), то для нее создается локальная привязка (в обычном смысле) на весь период действия let. В этой области привязки setqизменяет локальное значение. Лучше говорить о том, что вхождение var является локальным (в стеке) или глобальным (в куче), чем var.
M-x report-emacs-bugпредложить улучшения, которые могут помочь другим сделать это проще.