¿Por qué setq y set quote actúan de forma diferente en variables let-bound con alcance léxico?

14

Tuve un error en una de mis extensiones que finalmente resultó ser que setno funcionó como esperaba:

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

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


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

cuando se ejecuta con emacs -Q --batch -l temp.elimpresiones:

t

nil

Esto me parece muy extraño. Tenía la impresión de que (setq a b)es la abreviatura de (set 'a b). ¿Que esta pasando?

dshepherd
fuente

Respuestas:

14

Este es un comportamiento documentado. La explicación (muy mejorada) en el manual de Emacs 25.1 elisp es la siguiente:

Tenga en cuenta que a diferencia de las variables dinámicas que están vinculadas al objeto de símbolo en sí, la relación entre las variables léxicas y los símbolos solo está presente en el intérprete (o compilador). Por lo tanto, las funciones que toman un argumento de símbolo (como 'symbol-value', 'boundp' y 'set') solo pueden recuperar o modificar el enlace dinámico de una variable (es decir, el contenido de la celda de valor de su símbolo).

C-hig (elisp) Lexical Binding

phils
fuente