У чому різниця між 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
дозволяє приєднувати рядок doc , і що якщо змінна вже має значення, то вона нічого не робить .
Він також повідомляє вам про використання defvar
з значення не повинні бути призначені: (defvar foo)
. Це говорить вам, що це оголошує змінну для динамічного визначення обсягу .
setq
не має жодної з цих властивостей.
defvar
і setq
схожі, але не зовсім однакові у Emacs Lisp та Common Lisp.
defvar
глобальна змінна (як у стилі імперативного програмування) та умова для налаштування, тоді як setq більше схожий на прив'язку дозволу у функціональних мовах програмування (з динамічним / лексичним правилом визначення, залежно від того, який режим глобального масштабування активний .. .......)
setq
встановлює значення var, незалежно від того, локальний (var) (локальний). defvar
оголошує var як глобальний. (Це також може бути "буферно-локальним":. local-variable-p
) Вплив var, пов'язаний як функція arg або by, let
є "локальним" у звичайному розумінні. Якщо var, пов'язаний і let
т. Д., Є глобальним (або буферно-локальним), тоді для нього створюється локальне прив'язування (звичайний сенс) протягом тривалості / сфери застосування let
. У межах цього обов'язкового обсягу setq
змінюється місцеве значення. Краще говорити про те, що поява var локальна (у стеці) або глобальна (у купі), ніж така, що є var.
M-x report-emacs-bug
запропонувати вдосконалення, які можуть допомогти іншим легше зробити це.