Pourquoi setq et set quote agissent-ils différemment sur les variables let-bound à portée lexicale?

14

J'ai eu un bug dans l'une de mes extensions qui s'est finalement avéré être causé par le fait de setne pas fonctionner comme prévu:

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

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


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

lorsqu'il est exécuté avec des emacs -Q --batch -l temp.elimpressions:

t

nil

Cela me semble très étrange. J'avais l'impression que c'était un (setq a b)raccourci (set 'a b). Que se passe-t-il?

dshepherd
la source

Réponses:

14

Il s'agit d'un comportement documenté. L'explication (beaucoup améliorée) dans le manuel Elisp d'Emacs 25.1 est la suivante:

Notez que contrairement aux variables dynamiques qui sont liées à l'objet symbole lui-même, la relation entre les variables lexicales et les symboles n'est présente que dans l'interpréteur (ou le compilateur). Par conséquent, les fonctions qui prennent un argument de symbole (comme 'symbol-value', 'boundp' et 'set') ne peuvent que récupérer ou modifier la liaison dynamique d'une variable (c'est-à-dire le contenu de la cellule de valeur de son symbole).

C-hig (elisp) Lexical Binding

phils
la source