Warum verhalten sich setq und set quote bei Variablen mit Let-Bound und lexikalischem Gültigkeitsbereich unterschiedlich?

14

Ich hatte einen Fehler in einer meiner Erweiterungen, der schließlich darauf zurückzuführen war, dass setich nicht wie erwartet funktionierte:

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

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


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

bei Ausführung mit emacs -Q --batch -l temp.elAbzügen:

t

nil

Das kommt mir sehr merkwürdig vor. Ich hatte den Eindruck, das (setq a b)ist Abkürzung für (set 'a b). Was ist los?

dshepherd
quelle

Antworten:

14

Dies ist dokumentiertes Verhalten. Die (stark verbesserte) Erklärung im Emacs 25.1 elisp-Handbuch lautet wie folgt:

Beachten Sie, dass im Gegensatz zu dynamischen Variablen, die mit dem Symbolobjekt selbst verknüpft sind, die Beziehung zwischen lexikalischen Variablen und Symbolen nur im Interpreter (oder Compiler) vorhanden ist. Daher können Funktionen, die ein Symbolargument annehmen (wie 'symbol-value', 'boundp' und 'set'), nur die dynamische Bindung einer Variablen (dh den Inhalt der Wertezelle ihres Symbols) abrufen oder ändern.

C-hig (elisp) Lexical Binding

Phils
quelle