में गतिशील और लेक्सिकल चर, मैं पीटर सेबेल द्वारा 'प्रैक्टिकल कॉमन लिस्प' पुस्तक पढ़ रहा हूं।सामान्य लिस्प
अध्याय 6 में, "चर" खंड "लेक्सिकल वैरिएबल और क्लोजर" और "गतिशील, ए.के.ए. स्पेशल, वेरिएबल्स"। http://www.gigamonkeys.com/book/variables.html
मेरे समस्या यह है कि दोनों वर्गों में उदाहरणों से पता चलता है कि कैसे (हैं ...) वैश्विक चर शैडो कर सकते हैं और वास्तव में गतिशील और शाब्दिक वार्स के बीच अंतर नहीं बताता है।
मैं समझता हूँ कि कैसे बंद काम करते हैं लेकिन मैं वास्तव में क्या इतना बारे में इस उदाहरण में जाने विशेष नहीं मिलता:
(defvar *x* 10)
(defun foo()
(format t "Before assignment~18tX: ~d~%" *x*)
(setf *x* (+ 1 *x*))
(format t "After assignment~18tX: ~d~%" *x*))
(defun bar()
(foo)
(let ((*x* 20)) (foo))
(foo))
CL-USER> (foo)
Before assignment X: 10
After assignment X: 11
NIL
CL-USER> (bar)
Before assignment X: 11
After assignment X: 12
Before assignment X: 20
After assignment X: 21
Before assignment X: 12
After assignment X: 13
NIL
मुझे लगता है विशेष यहाँ पर जा रहा है कोई बात नहीं है की तरह। बार में बाहरी foo वैश्विक एक्स वृद्धि कर देता है, और fooसे घिरा हुआ बार वृद्धि कर देता है छाया एक्स में करते हैं। क्या बड़ी बात है? मैं नहीं देखता कि यह व्याख्यात्मक और गतिशील वार्स के बीच अंतर को समझाने के लिए कैसे किया जाता है। फिर भी पुस्तक इस तरह जारी है:
तो यह कैसे काम करता है? LET कैसे पता चलता है कि जब यह x बांधता है तो यह सामान्य लेक्सिकल बाध्यकारी के बजाय गतिशील बाध्यकारी बनाना चाहता है? यह जानता है क्योंकि नाम घोषित किया गया है .1.1 प्रत्येक का नाम DEFVAR और DEFPARAMETER के साथ परिभाषित चर स्वचालित रूप से वैश्विक रूप से घोषित किया गया है।
अगर जानेएक्स बाध्य होगा "सामान्य शाब्दिक बंधन" का उपयोग कर क्या whould? सब कुछ, गतिशील और शब्दावली बाध्यकारी के बीच अंतर क्या हैं और गतिशील बाध्यकारी के संबंध में यह उदाहरण विशेष कैसे है?
आम लिस्प में कोई व्याख्यात्मक वैश्विक चर नहीं है। कार्यान्वयन के आधार पर एसईटीक्यू के साथ आपका उदाहरण काम कर सकता है या नहीं भी हो सकता है। –
क्यों कोई वैश्विक शब्दावली नहीं? ऐसा लगता है कि ज्यादा समझ में नहीं आता है। –
आश्चर्य की बात है? लेकिन ऐसा ही है। एएनएसआई कॉमन लिस्प के मानक में कोई वैश्विक शब्दावली चर नहीं है। ** आपकी व्याख्या अधिकतर गलत है **। एलईटी जानता है कि एक चर लेक्सिकल है या नहीं। यह डिफ़ॉल्ट है और चर को लेक्सिकल वातावरण में परिभाषित किया जाना है। यह भी जानता है कि यह कब विशेष है, क्योंकि वहां 'विशेष' घोषणा की आवश्यकता है। डेफवर एक है। यदि आपका चरणीय नहीं है और विशेष घोषित नहीं किया गया है, तो लिस्प प्रणाली सभी प्रकार की धारणाओं को मुक्त करने के लिए स्वतंत्र है। आम लिस्प मानक यह नहीं कहता कि इसे कैसे काम करना चाहिए। एक कार्यान्वयन किसी भी तरह से इसका सामना करेगा। –