Mengapa setq dan set quote bertindak berbeda pada variabel let-bound dengan lingkup leksikal?

14

Saya memiliki bug di salah satu ekstensi saya yang pada akhirnya ternyata disebabkan oleh settidak berfungsi seperti yang saya harapkan:

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

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


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

saat dijalankan dengan emacs -Q --batch -l temp.elcetakan:

t

nil

Ini sepertinya sangat aneh bagi saya. Saya mendapat kesan bahwa itu (setq a b)adalah singkatan (set 'a b). Apa yang sedang terjadi?

dshepherd
sumber

Jawaban:

14

Ini adalah perilaku yang terdokumentasi. Penjelasan (jauh lebih baik) dalam manual elac Emacs 25.1 adalah sebagai berikut:

Perhatikan bahwa tidak seperti variabel dinamis yang terikat pada objek simbol itu sendiri, hubungan antara variabel leksikal dan simbol hanya ada dalam interpreter (atau kompiler). Oleh karena itu, fungsi yang mengambil argumen simbol (seperti 'nilai simbol', 'terikat', dan 'set') hanya dapat mengambil atau memodifikasi pengikatan dinamis variabel (yaitu, isi sel nilai simbolnya).

C-hig (elisp) Lexical Binding

phils
sumber