Какая разница между 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
предложить улучшения, которые могут помочь другим сделать это проще.