2017-08-03 12 views
7

ऐसा प्रतीत होता है कि अधिकांश (यदि नहीं सभी) वैश्विक declarations को एएनएसआई सीएल मानक तरीके से वापस नहीं किया जा सकता है।'घोषणा' घोषणा को पूर्ववत कैसे करें?

जैसे, एक बार आप (proclaim '(declaration my-decl)) या (declaim (special *my-var*)) कुछ ऐसे स्वरूप का मूल्यांकन (सीधे या एक फ़ाइल लोड करके) कोई पोर्टेबल(declare (my-decl ...)) गैर-कानूनी या *my-var* शाब्दिक बनाने के लिए रास्ता है।

विभिन्न कार्यान्वयन special घोषणा को वापस करने के लिए गैर-पोर्टेबल तरीका प्रदान करता है, आमतौर पर (proclaim '(notspecial *my-var*)) या कुछ अन्य चाल के माध्यम से।

declarationproclamation के बारे में कैसे?

विभिन्न कार्यान्वयन कैसे पूर्ववत करते हैं? आप इसे कैसे कार्यान्वित करेंगे? क्या आपको लगता है कि (proclaim '(notdeclaration my-decl)) एक अच्छा विचार है?

प्रेरणा: एक परीक्षण सूट में, मॉड्यूलर होना अच्छा होगा - परीक्षण सूट भागों के साथ किसी भी संभावित हस्तक्षेप से बचने के लिए परीक्षण विवरणों के सभी प्रभावों को वापस करने में सक्षम होना। मुझे पता है कि यह एक हफ्ते की प्रेरणा है क्योंकि सही तरीका packages का उपयोग करना है।

+0

हम्म। यदि आप परिवर्तनीय के प्रतीक को अनइंटर करते हैं तो क्या होता है? यह शायद एक बुरा विचार किया जाएगा के रूप में यह गंदगी प्रतीक –

+0

मैं SBCL में यह करने के लिए किसी भी उचित तरीके से नहीं दिख रहा है करने के लिए पुराने/नई संदर्भ के बीच कोई सीमा होगी, लेकिन ऐसा लगता है '(setf (sb-पूर्णांक लगता है: जानकारी : घोषणा: मान्यता प्राप्त नाम-घोषणा) शून्य) 'यह करेगा। – jkiiski

उत्तर

1

एक संभावित तरीका लेनदेन तंत्र (रोलबैक/प्रतिबद्ध) प्रदान करना है। यह Xach के Naggum के archive से लिया जाता है:

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

आप (declare B), (undeclare A)(declare A) तरह घोषणाओं का केवल एक उपसमूह पूर्ववत करने के लिए, है, लेकिन आपकी प्रेरणा दी संभावना अनदेखा कर देते हैं, यह एक समस्या नहीं होगी, क्योंकि आप के दौरान किए गए सभी संभव घोषणाओं को पूर्ववत करना चाहते की संभावना है एक परीक्षा।

आप व्यक्तिगत रूप से "अविकसित" घोषणाओं के लिए एक विशेष रूप प्रदान कर सकते हैं। मैं इसे नाम दूंगा, लेकिन कुछ मामलों में यह निर्दिष्ट करना मुश्किल हो सकता है। मान लीजिए कि आप घोषित करते हैं कि एक्स या तो एक स्ट्रिंग या संख्या है, क्या आप एक घोषणा को वापस ले सकते हैं जो कहता है कि एक्स एक स्ट्रिंग है? इनलाइन फ़ंक्शंस आदि के बारे में क्या? एक लेनदेन लागू करने के लिए आसान लग रहा है, उदाहरण के साथ एक अस्थायी वातावरण।

+0

मैं एक वाक्यविन्यास के बारे में पूछ रहा था जो तंत्र को उजागर करेगा, लेकिन लेनदेन दृष्टिकोण वास्तव में दिलचस्प है। – sds

+0

@sds वाक्यविन्यास के लिए, मैं प्रत्येक वैध 'घोषणा' के लिए अलग-अलग 'घोषणा' प्रतीक की तुलना में एक्स के साथ किसी भी वैध घोषणा अभिव्यक्ति के साथ '(अस्वीकरण (एक्स नहीं)) होगा। इसके अलावा, 'नहीं' भ्रमित हो सकता है: '(घोषित करें (नहीं (टी एक्स टाइप करें)) 'आमतौर पर' (घोषित नहीं (प्रकार (टी नहीं) एक्स) के समान नहीं है। प्रोलॉग ने 'जोर दिया' और 'रिट्रैक्ट' बिल्ट-इन्स, शायद '(घोषणा वापस लेना) बेहतर होगा। – coredump

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