Perché setq e set quote agiscono in modo diverso su variabili con limiti lessicali?


14

Ho avuto un bug in una delle mie estensioni che alla fine si è rivelato essere causato dal setmancato funzionamento come mi aspettavo:

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

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


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

quando eseguito con emacs -Q --batch -l temp.elstampe:

t

nil

Questo mi sembra molto strano. Avevo l'impressione che (setq a b)sia una scorciatoia per (set 'a b). Cosa sta succedendo?

Risposte:


14

Questo è un comportamento documentato. La spiegazione (molto migliorata) nel manuale elisp di Emacs 25.1 è la seguente:

Si noti che a differenza delle variabili dinamiche che sono legate all'oggetto simbolo stesso, la relazione tra variabili lessicali e simboli è presente solo nell'interprete (o nel compilatore). Pertanto, le funzioni che accettano un argomento simbolo (come 'valore-simbolo', 'limite' e 'set') possono solo recuperare o modificare il legame dinamico di una variabile (cioè il contenuto della cella del valore del suo simbolo).

C-hig (elisp) Lexical Binding

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.