ทำไม setq และ set quote ทำหน้าที่แตกต่างกันของตัวแปรที่มีขอบเขตเป็นขอบเขต


14

ฉันมีข้อผิดพลาดในหนึ่งในส่วนขยายของฉันซึ่งในที่สุดก็กลายเป็นว่าเกิดจากการsetไม่ทำงานตามที่ฉันคาดไว้:

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

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


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

เมื่อทำงานกับงานemacs -Q --batch -l temp.elพิมพ์:

t

nil

ดูเหมือนว่าฉันจะแปลกมาก ผมก็รู้สึกว่าเป็นชวเลข(setq a b) (set 'a b)เกิดอะไรขึ้น?

คำตอบ:


14

นี่คือพฤติกรรมที่บันทึกไว้ คำอธิบาย (ปรับปรุงมาก) ในคู่มือ elisp ของ Emacs 25.1 มีดังนี้:

โปรดทราบว่าแตกต่างจากตัวแปรแบบไดนามิกที่เชื่อมโยงกับวัตถุสัญลักษณ์ความสัมพันธ์ระหว่างตัวแปรศัพท์และสัญลักษณ์มีอยู่เฉพาะในล่าม (หรือคอมไพเลอร์) ดังนั้นฟังก์ชั่นที่รับอาร์กิวเมนต์สัญลักษณ์ (เช่น 'symbol-value', 'boundp' และ 'set') สามารถดึงหรือแก้ไขการเชื่อมโยงแบบไดนามิกของตัวแปรเท่านั้น (เช่นเนื้อหาของเซลล์ค่าของสัญลักษณ์)

C-hig (elisp) Lexical Binding

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.