2011-12-05 18 views
12

मैं आरईपीएल पर हूँ, और मैं एक जावा सारिणी निर्मित में आदिम सरणी:मुद्रण Clojure

=> (def arr (double-array [1 2 3])) 
बेशक

, अगर मैं अपने arr को देखने के लिए चाहते हैं, तो मैं मिलता है:

=> arr 
#<double[] [[email protected]> 

क्या ऐसा कुछ भी है जो मैं कर सकता हूं जो जावा प्राइमेटिव्स के सरणी को क्लोजर के persistentVector एस जैसे प्रिंट करेगा?

=> arr 
[1.0 2.0 3.0] 

मैं जानता हूँ कि मैं अच्छा मुद्रण समारोह में किसी प्रकार का (जो मैं वर्तमान में क्या कर) में मेरी सरणियों लपेट सकता है, लेकिन इस मामले में दर्द, उदाहरण के लिए जहां वैक्टर मानचित्र का हिस्सा हैं के लिए है:

=> my-map 
{"1" #<double[] [[email protected]>, "2" #<double[] [[email protected]>} 

उत्तर

18

चाहेंगे निम्नलिखित है के रूप में सरल कुछ होता है ?

user=> (seq arr) 
(1.0 2.0 3.0) 

यदि यह केवल आरईपीएल के लिए है, तो शायद तकनीकी अर्थशास्त्र कोई फर्क नहीं पड़ता।

अद्यतन

ऐसा लगता है कि सुंदर प्रिंट (pprint) वैक्टर के अपने नक्शे के साथ बस ठीक काम करता है:

user=> (def my-map {"1" (double-array [1 2 3]) 
        "2" (double-array [1 2 3])}) 
#'user/my-map 
user=> (pprint my-map) 
{"1" [1.0, 2.0, 3.0], "2" [1.0, 2.0, 3.0]} 

अंतिम अद्यतन: टिप्पणी में जुड़े हुए Google समूह चर्चा से

प्रश्नकर्ता को एक उत्तर मिला जो उसे नीचे उल्लिखित चर्चा में पसंद आया:

> क्या क्लोजर प्रतिलिपि डिफ़ॉल्ट रूप से सुंदर प्रिंट करने का कोई तरीका है?

प्रयास करें:

(clojure.main/repl :print pprint)

> धन्यवाद! यही वही है जो मुझे चाहिए था।

+0

धन्यवाद, स्कॉट। सुंदर प्रिंट यहां जवाब का आधा है। दूसरा आधा है: http://groups.google.com/group/clojure/browse_thread/thread/c9db56b8daeaffa2?fwc=1&pli=1 – charleslparker

+1

वाह। यह वास्तव में अच्छा है। जब हम स्टैक ओवरफ़्लो के माध्यम से कुछ खोजते हैं तो मुझे यह पसंद है। टीम के काम के लिए उच्च मछुआरे! – Scott

+0

@ScottLowe: कृपया इसे अपने उत्तर में शामिल करें। यह एक जगह में दोनों हिस्सों को चोट पहुंचाने में कोई दिक्कत नहीं होगी :) –

1

स्ट्र फ़ंक्शन बस जावा ऑब्जेक्ट की .toString को कॉल करता है, जो सरणी पर बहुत सुविधाजनक नहीं है। एक अच्छा प्रतिनिधित्व प्राप्त करने के लिए (जैसा कि अन्य ने भी कहा है) (java.util.Arays/toString arr) को बुलाया जा सकता है।

हालांकि, यह सामान्य क्लोजर println और str कोड में पारदर्शी रूप से कैसे कार्यान्वित किया जा सकता है? क्या हम ऐरे पर प्रॉक्सी लागू कर सकते हैं और .toString विधि को प्रतिस्थापित कर सकते हैं? या क्या हमें ऐरे क्लास को छोड़कर सब कुछ के लिए str का उपयोग करके एक नया str2 प्रोटोकॉल लागू करना चाहिए?

मेरा अनुमान है कि प्रॉक्सिड एआर सबसे अच्छा विकल्प होगा, क्योंकि यह उस दूसरे कोड के साथ काम करेगा जो उस पर स्ट्रिंग करता है, भले ही इसे किसी अन्य नामस्थान से बुलाया गया हो। पता नहीं कैसे सरणी पर एक प्रॉक्सी लागू करने के लिए :)

1

हमेशा जावा इंटरॉप समाधान नहीं है, हालांकि:

(java.util.Arrays/toString arr) 

तो तुम

(map #(java.util.Arrays/toString (val %)) my-map)