2011-05-29 5 views
6

तुतलाना मैं मुक्त इस तरह एक बंद में बंधे चर बाध्य कर सकते हैं में ...LISP में बंद करने में निःशुल्क चर का निरीक्षण कैसे करें?

(let ((x 1) (y 2) (z 3)) 
    (defun free-variables() (+ x y z))) 

(free-variables) 

परिणामों में ...

6 

क्या मैं जानना चाहता हूँ अगर यह बाध्य निरीक्षण करने के लिए संभव है गतिशील रूप से बंद चर?

उदा।

(inspect-closure free-variables) 

कुछ की तरह है, जिसके परिणामस्वरूप ...

((x 1) (y 2) (z 3)) 

धन्यवाद अतः

उत्तर

7

कॉमन लिस्प

बंद के आंतरिक चर तक पहुंच ही दायरे में कार्यों से ही संभव है (जेफ के जवाब देखें)। यहां तक ​​कि वे इन चर के लिए कहीं भी क्वेरी नहीं कर सकते हैं। यह कार्यक्षमता सामान्य लिस्प मानक द्वारा प्रदान नहीं की जाती है।

स्पष्ट रूप से कई मामलों में व्यक्तिगत आम लिस्प कार्यान्वयन जानते हैं कि यह जानकारी कैसे प्राप्त करें। यदि आप जीएनयू एमएक्स के लिए एसएलआईएमई कोड (एक सामान्य लिस्प विकास पर्यावरण) पर उदाहरण देखते हैं, तो के लिए कोड और बैकट्रैक कार्यशीलताओं को प्रदान करना चाहिए। विकास यह दिखाना चाहता है - उपयोगकर्ता/प्रोग्रामर के लिए आम लिस्प मानक उस जानकारी को प्रदान नहीं करता है।

+1

धन्यवाद यह जानकारी मैं जो खोज रहा था वह धन्यवाद। –

4

आप एक बाड़े के अंदर अनेक कार्यों का हो सकता है, तो सिर्फ एक और समारोह

(defun inspect-closure() (list (list 'x x) (list 'y y) (list 'z z))) 

जोड़ सकते हैं और डाल यह आपके let कथन

के अंदर

यदि आप एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहे हैं जो तब तक पहुंच जाएगा - कड़ाई से बोलते हुए, मुझे नहीं लगता कि यह संभव है। एक्स, वाई, और जेड स्थानीय रूप से परिभाषित किए गए हैं ताकि यदि आप उन्हें दुनिया में घोषित करना चाहते हैं तो इसे बंद करने के भीतर से आना होगा। आप क्या कर सकते हैं एक मैक्रो बनाना जो let कार्यक्षमता को डुप्लिकेट करता है जिसमें इसके स्थानीय चर वापस करने की अतिरिक्त क्षमता होती है। आप शायद इसे कुछ अलग नाम देना चाहेंगे, जैसे mylet या जो भी हो।

+1

धन्यवाद जेफ, लेकिन मैं एक लिस्टिंग- या निरीक्षण-शैली प्रकार समारोह जैसे संलग्न चर के लिए प्रोग्रामेटिक पहुंच की तलाश में हूं। जाहिर है यह मानक सीएल में समर्थित नहीं है। –

+1

तब मुझे लगता है कि, मेरे उत्तर के दूसरे भाग के अनुसार, आपका सबसे अच्छा शर्त मैक्रो बनाना है। क्षमा करें हम और अधिक मदद नहीं कर सका! – Jeff

संबंधित मुद्दे