2012-10-28 9 views
12

Clojure 1.4.0 के साथ lein repl का उपयोग करना, मैं एक जावा बाइट सरणी के एक ^:const परिभाषित कर सकते हैं, लेकिन मैं तो इसके साथ कुछ नहीं कर सकते:मैं जावा बाइट सरणी के साथ Clojure's^^ const का उपयोग क्यों नहीं कर सकता?

user=> (def x (byte-array (map byte [0 1 2 3]))) 
#'user/x 
user=> (alength x) 
4 
user=> (type x) 
[B 
user=> (def ^:const cx (byte-array (map byte [0 1 2 3]))) 
#'user/cx 
user=> (alength cx) 
CompilerException java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: [[email protected], compiling:(NO_SOURCE_PATH:1) 
user=> (type cx) 
CompilerException java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: [[email protected], compiling:(NO_SOURCE_PATH:1) 

मैंने पुष्टि की है इस के रूप में अच्छी तरह से मेरे एप्लिकेशन में होता है , इसलिए यह सिर्फ एक आरईपीएल मुद्दा नहीं है।

मुझे क्या याद आ रही है?

उत्तर

11

^: कॉन्स फॉर्म का संकलन समय पर मूल्यांकन किया जाता है, लेकिन क्लोजर में, संकलन-समय मानों को प्रिंट करने योग्य और पठनीय (क्लोजर रीडर द्वारा) * होना चाहिए। अधिकांश जावा वस्तुओं की तरह, बाइट-एरे प्रिंट करने योग्य या पठनीय नहीं होते हैं, इसलिए आप उनमें से निरंतर नहीं बना सकते हैं।

इसके अलावा, दस्तावेज़ों के अनुसार, ^: कॉन्स केवल प्राइमेटिव के लिए उपयोगी है। आदिम सरणी नहीं।

+0

धन्यवाद जोओस्ट, यह बहुत ही निर्देशक है! –

+0

मैं एक गैर-जावा पृष्ठभूमि से आया हूं, और मैंने आज सुबह इस समस्या का पीछा करते हुए थोड़ी देर बिताई, जहां मेरा मूल्य java.io.File था। यह सवाल और उत्तर "क्यों" को समझने में मददगार थे, मुझे पता चला कि क्या हो रहा था। –

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