Por que setq e set quote agem de maneira diferente em variáveis ​​vinculadas com escopo lexical?

14

Eu tive um bug em uma das minhas extensões que acabou sendo causado por setnão funcionar como eu esperava:

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

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


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

quando executado com emacs -Q --batch -l temp.elimpressões:

t

nil

Isso me parece muito estranho. Fiquei com a impressão de que (setq a b)é uma abreviação de (set 'a b). O que está acontecendo?

dshepherd
fonte

Respostas:

14

Este é um comportamento documentado. A explicação (muito aprimorada) no manual Emacs 25.1 elisp é a seguinte:

Observe que, diferentemente das variáveis ​​dinâmicas vinculadas ao próprio objeto símbolo, o relacionamento entre variáveis ​​lexicais e símbolos está presente apenas no intérprete (ou compilador). Portanto, funções que recebem um argumento de símbolo (como 'valor do símbolo', 'boundp' e 'set') podem recuperar ou modificar apenas a ligação dinâmica de uma variável (ou seja, o conteúdo da célula de valor do símbolo).

C-hig (elisp) Lexical Binding

phils
fonte