लेक्सिकल स्कोप के साथ लेट-बाउंड वैरिएबल पर सेट और सेट एक्ट अलग-अलग क्यों होते हैं?


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

यह प्रलेखित व्यवहार है। Emacs में 25.1 (बहुत सुधरी हुई) व्याख्या इस प्रकार है:

ध्यान दें कि डायनामिक वैरिएबल्स के विपरीत जो कि सिंबल ऑब्जेक्ट से जुड़े होते हैं, लेक्सिकल वैरिएबल और सिंबल के बीच का संबंध केवल दुभाषिया (या कंपाइलर) में मौजूद होता है। इसलिए, फ़ंक्शन जो एक प्रतीक तर्क लेते हैं (जैसे 'प्रतीक-मूल्य', 'बाध्य' और 'सेट') केवल एक चर के गतिशील बंधन (यानी, इसके प्रतीक के मूल्य सेल की सामग्री) को पुनः प्राप्त या संशोधित कर सकते हैं।

C-hig (elisp) Lexical Binding

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.