Tại sao setq và set quote hoạt động khác nhau trên các biến giới hạn với phạm vi từ vựng?


14

Tôi đã gặp một lỗi trong một trong các tiện ích mở rộng của mình mà cuối cùng hóa ra là do setkhông hoạt động như tôi mong đợi:

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

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


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

khi chạy với emacs -Q --batch -l temp.elbản in:

t

nil

Điều này có vẻ rất lạ đối với tôi. Tôi đã có ấn tượng đó (setq a b)là tốc ký (set 'a b). Chuyện gì đang xảy ra vậy?

Câu trả lời:


14

Đây là hành vi được ghi lại. Giải thích (được cải thiện nhiều) trong hướng dẫn sử dụng Emacs 25.1 như sau:

Lưu ý rằng không giống như các biến động được gắn với chính đối tượng ký hiệu, mối quan hệ giữa các biến từ vựng và ký hiệu chỉ có trong trình thông dịch (hoặc trình biên dịch). Do đó, các hàm lấy đối số ký hiệu (như 'giá trị ký hiệu', 'ràng buộc' và 'bộ') chỉ có thể truy xuất hoặc sửa đổi liên kết động của biến (nghĩa là nội dung của ô giá trị ký hiệu của nó).

C-hig (elisp) Lexical Binding

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.