Яка різниця між setq і defvar


Відповіді:


18

Вам слід задати Emacs це запитання: C-h iвиберіть посібник Elisp ( m Elisp) та шукайте в індексі "defvar" ( i defvar). Це призведе до визначення вузлів визначення змінних .

Emacs повідомляє, що defvarдозволяє приєднувати рядок doc , і що якщо змінна вже має значення, то вона нічого не робить .

Він також повідомляє вам про використання defvarз значення не повинні бути призначені: (defvar foo). Це говорить вам, що це оголошує змінну для динамічного визначення обсягу .

setq не має жодної з цих властивостей.

defvarі setqсхожі, але не зовсім однакові у Emacs Lisp та Common Lisp.

Читайте більше, щоб дізнатися більше.


1
Насправді defvar також оголошує "динамічне оцінювання", якщо є задане значення, і це залишається істинним, навіть якщо змінна вже мала значення. OTOH "якщо змінна вже має значення, то вона нічого не робить" справедлива для всіх дійсних застосувань defvar (і байт-компілятор повинен видавати попередження в решті випадків, тобто якщо оголошувати змінну після її першого використання).
ЯнгФрог

тому це звучить як defvarглобальна змінна (як у стилі імперативного програмування) та умова для налаштування, тоді як setq більше схожий на прив'язку дозволу у функціональних мовах програмування (з динамічним / лексичним правилом визначення, залежно від того, який режим глобального масштабування активний .. .......)
Ніколас

@nicolas: Прочитайте посібник. setqвстановлює значення var, незалежно від того, локальний (var) (локальний). defvarоголошує var як глобальний. (Це також може бути "буферно-локальним":. local-variable-p) Вплив var, пов'язаний як функція arg або by, letє "локальним" у звичайному розумінні. Якщо var, пов'язаний і letт. Д., Є глобальним (або буферно-локальним), тоді для нього створюється локальне прив'язування (звичайний сенс) протягом тривалості / сфери застосування let. У межах цього обов'язкового обсягу setqзмінюється місцеве значення. Краще говорити про те, що поява var локальна (у стеці) або глобальна (у купі), ніж така, що є var.
Дрю

1
@nicolas: Знайдіть свій час, читаючи його та перечитуючи. Іноді те, що він говорить, є точним, але важко зрозуміти, як формальна специфікація. Як тільки ви отримаєте це, вам може бути корисно M-x report-emacs-bugзапропонувати вдосконалення, які можуть допомогти іншим легше зробити це.
Дрю

1
@nicolas: Почніть з розуміння змінної на купі (також глобальної чи буферної локальної змінної). Ви, ймовірно, вже розумієте справжні локальні змінні, тобто змінні в стеці . Гуглінг також може допомогти.
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.