2015-10-30 10 views
10

में सामान्य लिस्प बाध्यकारी मैं लूप के अंदर एक विशेष चर को पुनर्निर्मित करना चाहता हूं। अब, आमतौर पर, यह let का उपयोग करके पूरा किया जाता है।लूप मैक्रो

(let ((*read-eval* nil)) 
    (do-something-here)) 

लेकिन चूंकि loop मैक्रो इन अच्छा with खंड है, मैंने सोचा कि मैं वहाँ में ऐसा करने में सक्षम हो सकता है। अभिव्यक्ति (macroexpand '(loop with *read-eval* = nil)) बाध्यकारी को let तक विस्तारित करती है, इसलिए यह निश्चित रूप से मेरे कार्यान्वयन पर विशेष रूप से काम करेगी। लेकिन मुझे the standard में कुछ भी नहीं मिला है जो दर्शाता है कि यह मानकीकृत व्यवहार है। तो, मुझे लगता है, मेरे सवाल यह है:

(loop with *read-eval* = nil 
     for i from 1 to 10 
     do (something-involving-the-read-function)) 

अनुरूप रहे हैं मौजूदा *read-eval* चर को संशोधित करने के लिए आवश्यक कार्यान्वयन, या वहाँ एक जोखिम है कि वे एक ही नाम के एक नए शाब्दिक चर बना सकते है?

उत्तर

7

*read-eval* एक वैश्विक विशेष चर है। इसे पूर्ववत करने का कोई तरीका नहीं है, यानी, इसके लिए स्थानीय शब्दावली बाध्यकारी बनाएं।

with खंड bindings का उपयोग कर जिसका मतलब है कि, वास्तव में, एक बार पाश किया जाता है, हम वापस मूल मान (करने के लिए @ यहोशू-दर्जी के जवाब देने के लिए हो जाएगा (के रूप में मात्र स्थापित करने के खिलाफ) के रूप में वर्णन किया गया है सवाल)।

हमें तर्कसंगत सोचने दें। (loop with foo = nil ...) निश्चित रूप से foo के लिए बाध्यकारी स्थापित करता है। तो, (loop with *read-eval* = nil ...) के लिए बाध्यकारी स्थापित करने के लिए, कार्यान्वयन को जांचने के लिए (मैक्रोएक्सपेंशन या संकलन समय पर) *read-eval*dynamic variable रन टाइम पर होगा। यह पागल लगता है।

+2

यह सच है, लेकिन यह अभी भी स्पष्ट नहीं है कि ** लूप ** को केवल असाइन करने के विरोध में पुनर्विचार करना है। क्या हम जानते हैं कि एक बार लूप हो जाने के बाद, हम मूल मूल्य पर वापस आ जाएंगे? मुझे पूरा यकीन है कि उत्तर हाँ है, http://www.lispworks.com/documentation/HyperSpec/Body/06_abb.htm पर आधारित है, जो कहता है कि लूप के बाहर चर मौजूद हैं। Phrasing विशेष चर के लिए विशेष रूप से अच्छी तरह से काम नहीं करता है, लेकिन ऐसा लगता है कि केवल उचित व्याख्याएं नाम की स्थानीय बाध्यकारी हैं, जिसका अर्थ है * let * (या * lambda *, आदि)। –