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