मेरे पास dosync
और ref-set
का उपयोग करके बनाया गया एक चक्रीय ग्राफ है। जब मैं इसे println
पर पास करता हूं तो मुझे java.lang.StackOverflowError
मिलता है जैसा कि मैं अपेक्षा करता हूं, क्योंकि यह प्रभावी रूप से असीमित-नेस्टेड संरचना को मुद्रित करने का प्रयास कर रहा है।संदर्भ प्रकारों के लिए println व्यवहार को ओवरराइड करने के लिए कैसे करें
मैंने पाया कि यह कुछ है कि [email protected]
की तरह लग रहा है और वास्तव में संरचना पार और सब कुछ बाहर मुद्रित करने के लिए कोशिश नहीं करता बनाता है, तो मैं (str my-ref)
करते हैं, तो यह तत्काल अर्थ में समस्या का हल है, लेकिन केवल मदद करता है जब मैं कर रहा हूँ मैं स्क्रीन पर क्या प्रिंट कर रहा हूं इसके बारे में बहुत सावधान हूं। मैं (println my-graph)
पर कॉल करने में सक्षम होना चाहता हूं, क्या यह ref
को कुछ प्रकार के कस्टम टेक्स्ट (संभवत: str
शामिल) के रूप में प्रिंट करता है, और अन्य गैर-रेफरी सामान सामान्य रूप से।
वर्तमान में मेरे पास एक कस्टम प्रिंट फ़ंक्शन है जो संरचना के प्रत्येक तत्व को अपने आप प्रिंट करता है और पूरी तरह से ref
प्रिंटिंग छोड़ देता है। (यह पता चला है कि [email protected]
पर वास्तव में बहुत उपयोगी नहीं है)। यह उपयोग करने के लिए अजीब है और आरईपीएल में सामानों का आकस्मिक निरीक्षण करने में बाधा डालता है और एमएक्स इंस्पेक्टर को सामान देखने से रोकता है जबकि मैं swank.core/break
डीबग चीज़ में हूं।
एक विवरण ref
वास्तव में defstruct
में एक मान है जिसमें कुछ अन्य सामान भी शामिल हैं जिन्हें मैं सामान्य रूप से प्रिंट करने की कोशिश कर रहा हूं।
तो मैं सोच रहा हूं कि मुझे किस मार्ग पर जाना चाहिए। मैं इन विकल्पों में देखें:
- बाहर
extend-type
चित्रा और मेरेdefstruct
एड संरचना करने के लिएCharSequence
प्रोटोकॉल लागू ताकि जब यह एकref
भर आता है यह ठीक से काम करता है। यह अभी भीref
की बात करते समय संरचना के क्षेत्र-दर-क्षेत्र निरीक्षण और एक विशेष मामले की आवश्यकता है, लेकिन कम से कम यह संरचना को समस्या को स्थानीयकृत करता है, न कि संरचना में शामिल किसी भी चीज़ के लिए। - प्रोटोकॉल को ओवरराइड करने के तरीके को चित्रित करें जब यह
ref
पर आता है। यह और भी स्थानीयकृत व्यवहार की अनुमति देता है और मुझे आरपीएल पर चक्रीय रेफरी देखने की इजाजत देता है, भले ही यह एक संरचना के अंदर न हो। यह मेरा पसंदीदा विकल्प है। toString
के साथ कुछ करने का तरीका बताएं, जो मुझे लगता है किprintln
पर कुछ स्तर पर मुझे विश्वास है। मैं इस विकल्प के बारे में सबसे अज्ञानी हूँ। अन्य लोगों के बारे में बहुत अनजान है, लेकिन मैंJoy of Clojure
पढ़ रहा हूं और अब मैं सभी प्रेरित हूं।
इसी तरह इस समाधान print
और pprint
और कुछ और है कि सामान्य रूप से barf होगा जब एक चक्रीय रेफरी प्रिंट करने का प्रयास करने के लिए आवेदन करना चाहिए। मुझे किस रणनीति को नियोजित करना चाहिए?
किसी भी इनपुट के लिए बहुत बहुत धन्यवाद।
fyi, '' (str my-ref) 'का आउटपुट लगभग निश्चित रूप से 'java.lang.Object # toString()' 'को कॉल करने का परिणाम है जैसा कि यहां विस्तृत किया गया है: http://docs.oracle। कॉम/जावाज़/7/डॉक्स/एपीआई/जावा/लैंग/ऑब्जेक्ट.html # टूस्ट्रिंग% 28% 2 9 – sw1nn
ध्यान दें कि 'defreruct' को 'defrecord' द्वारा हटा दिया गया है। इसके अतिरिक्त, 'defstruct' वास्तविक प्रकार नहीं बनाता है इसलिए यह प्रोटोकॉल में भाग नहीं ले सकता है। – raek
मुझे एहसास है कि मैं वास्तव में पहले से ही 'defrecord' का उपयोग कर रहा था। निश्चित नहीं है कि मेरी मूल पोस्ट ने 'defstruct' क्यों कहा। – Sonicsmooth