संपादित करें: मैंने पहले जवाब के बाद उदाहरण कोड बदल दिया क्योंकि मैं एक साधारण संस्करण के साथ आया जो एक ही प्रश्न पूछता है।कॉमन लिस्प स्कोपिंग (गतिशील बनाम लेक्सिकल)
मैं वर्तमान में आम लिस्प के स्कोपिंग गुणों को सीख रहा हूं। मैंने सोचा कि मुझे ठोस समझ है, मैंने कुछ उदाहरणों को कोड करने का फैसला किया है कि मैं परिणाम की भविष्यवाणी कर सकता हूं, लेकिन स्पष्ट रूप से मैं गलत था।
उदाहरण 1:: मैं तीन सवाल है, नीचे एक उदाहरण से संबंधित हर एक है
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
आउटपुट:
5
*** - EVAL: variable X has no value
प्रश्न: यह समझ में आता है। एक्स स्थिर रूप से स्कॉप्ड है और fun2 के पास एक्स के मान को स्पष्ट रूप से पारित किए बिना कोई रास्ता नहीं है।
उदाहरण 2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
आउटपुट:
5
5
प्रश्न: मुझे समझ नहीं आता क्यों एक्स के बजाय एक मूल्य के होने का, मूल्य कि fun1 दे दिया साथ fun2 को अचानक दिखाई दे रहा है 100 में से ...
उदाहरण 3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
आउटपुट:
5
100
प्रश्न: मैं एक अघोषित चर पर setf बुला जाहिरा तौर पर अपरिभाषित है के बाद से इन परिणामों को अनदेखा कर देना चाहिए? यह वही है मैं अपने दूसरे उदाहरण में उम्मीद करेंगे ...
किसी भी अंतर्दृष्टि बहुत सराहना की जाएगी ...
यहाँ एक छोटा सा चारों ओर खेलने के बाद मेरी भोली विवरण है ... मुझे पता है कि अगर मैं करीब हूँ चलो .. उदाहरण के 1: कोई स्पष्टीकरण नहीं उदाहरण 2 की जरूरत है: एक गतिशील चर के रूप में घोषित करने एक्स के सभी उदाहरणों का कारण बनता है एक्स को डायनामिक वैरिएबल स्टैक पर रन टाइम पर देखा जाना चाहिए, जो गतिशील चर होने के बावजूद fun2 से x के मान को प्राप्त करने के लिए fun2 का कारण बन जाएगा। उदाहरण 3: कोई विचार नहीं ... मुझे लगता है कि यह अपरिभाषित –
* बढ़ रहा है * प्रश्न अच्छा है। * भिक्षा * प्रश्न ** खराब है ** ** –
DEFMETHOD के बजाय DEFUN का उपयोग करें। इन उदाहरणों में एक डेफमेथोड की आवश्यकता नहीं है। डेफन एक साधारण काम बनाता है। डेफमेथोड सामान्य कार्यों के लिए है, जहां आपको कुछ प्रेषण की आवश्यकता है। –