2016-04-12 3 views
7

एक मैक्रो के लिए पारंपरिक, अच्छी तरह से व्यवहार करने का तरीका क्या इंगित करता है कि यह अवैध तर्क पारित किया गया है?defmacro के अंदर एक त्रुटि को इंगित करने का पारंपरिक तरीका क्या है?

(defmacro defthisthing [name & definitions] . . .) 

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

मैं वर्तमान में सोच रहा हूं कि अपवाद फेंकना सबसे अधिक समझ में आता है, क्योंकि अमान्य मैक्रो तर्क वास्तव में एक संकलन त्रुटि हैं। कंपाइलर असंतुलित कोष्ठक मिलने के अलावा सबकुछ अलग-अलग बंद होना चाहिए।

यदि यह सही है, तो फेंकने के पारंपरिक अपवाद क्या हैं? और आप कोड के अपमानजनक स्निपेट के फ़ाइल नाम और लाइन नंबर को कैसे शामिल करते हैं?

और यदि यह सही नहीं है, तो अधिक क्लोज़रली दृष्टिकोण क्या है?

+0

यह प्रश्न _conventional_ या _Clojurely_ संकेत के रूप में शब्दों के लिए राय के लिए कॉल करना प्रतीत होता है। यह उन उत्तरों पर आधारित उत्तर को स्पष्ट कर सकता है जो कम तकनीकी मूल्य रखते हैं (_ "मुझे इसे 'foo' तरीका" _... करना पसंद है)। क्या आप अपने प्रश्न को संपादित कर सकते हैं ताकि आप जो हासिल करना चाहते हैं उसके तकनीकी पहलू पर अधिक ध्यान केंद्रित कर सकें? उदाहरण के लिए: _ "मैक्रो के अंदर से गुजरने वाले अमान्य तर्क की रिपोर्ट कैसे करें? _" –

+0

मैक्रो में किसी त्रुटि की रिपोर्ट करने के लिए _how_ के बारे में सोचने में कोई समस्या नहीं है- मैं कई तरीकों से सोच सकता हूं। मैं क्लोजर में ऐसा करने के लिए _conventional_ तरीका जानना चाहता हूं। –

उत्तर

6

अपवाद फेंकना ठीक लगता है। मैंने क्लोजर स्रोत की जांच की है और इस तरह यह किया जाता है:

(defmacro let ...)(defmacro assert-args ...) पर कॉल करता है, जो तर्कों को अपवाद फेंकता है यदि तर्क उनकी आवश्यकताओं को पूरा नहीं करते हैं।

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

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