Dlaczego setq i set quote działają inaczej na zmienne ze zmienną letnią o zakresie leksykalnym?

14

Miałem błąd w jednym z moich rozszerzeń, które ostatecznie okazało się być spowodowane setniedziałaniem zgodnie z oczekiwaniami:

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

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


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

po uruchomieniu z emacs -Q --batch -l temp.elwydrukami:

t

nil

Wydaje mi się to bardzo dziwne. Miałem wrażenie, że (setq a b)jest to skrót (set 'a b). Co się dzieje?

dshepherd
źródło

Odpowiedzi:

14

Jest to udokumentowane zachowanie. (Znacznie ulepszone) wyjaśnienie w podręczniku Emacsa 25.1 elisp jest następujące:

Zauważ, że w przeciwieństwie do zmiennych dynamicznych, które są powiązane z samym obiektem symbolu, związek między zmiennymi leksykalnymi a symbolami występuje tylko w interpretatorze (lub kompilatorze). Dlatego funkcje, które pobierają argument symbolu (takie jak „symbol-wartość”, „boundp” i „zestaw”) mogą jedynie pobierać lub modyfikować dynamiczne wiązanie zmiennej (tj. Zawartość komórki wartości jej symbolu).

C-hig (elisp) Lexical Binding

phils
źródło