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