Чому setq і set quo діють по-різному на обмежених змінних з лексичною сферою?


14

В одному з моїх розширень виявилася помилка, яка, зрештою, була викликана тим, що вона setне працює, як я очікувала:

;; -*- lexical-binding: t -*-

(let ((a nil))
  (setq a t)
  (print a))


(let ((a nil))
  (set 'a t)
  (print a))

при запуску з emacs -Q --batch -l temp.elвідбитками:

t

nil

Це здається мені дуже дивним. Я опинився під враженням, яке (setq a b)є скороченим (set 'a b). Що відбувається?

Відповіді:


14

Це документоване поведінка. Пояснення (значно вдосконалене) в посібнику Eiscs 25.1 elisp таке:

Зауважимо, що на відміну від динамічних змінних, які прив'язані до самого об'єкта символу, взаємозв'язок між лексичними змінними та символами присутній лише в інтерпретаторі (або компіляторі). Таким чином, функції, які приймають аргумент символу (наприклад, "символ-значення", "обмеження" та "набір"), можуть лише отримати або змінити динамічну прив'язку змінної (тобто вміст комірки значення символу).

C-hig (elisp) Lexical Binding

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.