2013-11-03 1 views
5

क्लोजर में int के लिए एक चरित्र को कैसे डाला जाए?क्लोजर में int के लिए एक चरित्र को कैसे डाला जाए?

मैं क्लोजर में एक रोट 13 लिखने की कोशिश कर रहा हूं, इसलिए मुझे अपने चार को int में डालने के लिए कुछ चाहिए। मैं कुछ (int) कहा जाता है पाया, तो मैं कर दिया:

(int a) 

प्राप्त करें: CompilerException java.lang.RuntimeException: प्रतीक को हल करने में असमर्थ: एक इस संदर्भ में, संकलन: (NO_SOURCE_PATH: 13: 1)

तो मैं डाल:

(int 'a) 

प्राप्त करें: ClassCastException clojure.lang.Symbol `java.lang.Character clojure.lang.RT.intCast में ढाला नहीं जा सकता है (RT.java:1087)

तब:

(rot13 ''a') 

प्राप्त करें: ClassCastException clojure.lang.PersistentList java.lang.Character clojure.lang.RT.intCast (RT.java:1087)

में ढाला नहीं जा सकता है और:

(rot13 "a") 

प्राप्त करें:

ClassCastException java.lang.String cannot be cast to java.lang.Character clojure.lang.RT.intCast (RT.java:1087) 

तो यह करने के लिए सही तरीके से क्या है?

बीटीडब्ल्यू, मैं हमेशा इन सभी क्लोजर वाक्यविन्यास से भ्रमित हो जाता हूं। लेकिन मुझे कोई समस्या नहीं मिल सकती है केवल मेरी समस्या के साथ मेरी मदद करें। कोई सुझाव? धन्यवाद!!

+3

मेरा मानना ​​है कि आप देख रहे हैं एक [ "चरित्र शाब्दिक"] (http://clojure.org/reader) जैसे '\ A' (त्रुटि संदेश यह एक चरित्र, नहीं एक पूर्णांक चाहती है) । – user2864740

+0

धन्यवाद! यह मेरी समस्या हल करता है। स्टैक ओवरफ्लो पर पहली बार और यह एक अच्छी जगह है! – zaolian

+1

[प्रलेखन] (http://clojure.org/documentation) का प्रयोग करें, खासकर [पाठक] (http://clojure.org/reader) के संबंध में। –

उत्तर

8

जो आप खोज रहे हैं वह एक अक्षर शाब्दिक \a है। एक वर्ण शाब्दिक एक वर्ण, या 16-बिट यूनिकोड कोड बिंदु द्वारा दर्शाया गया है, \ रीडर मैक्रो द्वारा पूर्ववर्ती।

(int \a) ;; => 97 

(int \0) ;; => 48 

(int \u0030) ;; => 48 


(int a) साथ , a एक प्रतीक है। इस प्रकार, रनटाइम ने कोशिश की और उस प्रतीक को हल करने में असफल रहा।


(int 'a) साथ , a भी प्रतीक है, लेकिन, क्योंकि आप इसे एकल उद्धरण (') के साथ एक प्रतीक की घोषणा की, क्रम यह सचमुच लिया और कोशिश की और faild एक java.lang.Character को clojure.lang.Symbol कास्ट करने के लिए।


(rot13 ''a') साथ , 'a' एक प्रतीक के रूप a' की घोषणा की। लेकिन, अतिरिक्त ' उपसर्ग करने से रनटाइम अभिव्यक्ति का इलाज करता है जिसने a' को शाब्दिक रूप से घोषित किया है। 'a'(quote a') तक फैला है, इसलिए "शाब्दिक शाब्दिक", ''a', सूची (quote a') पर विस्तारित करता है।

''a' ;; => (quote a') 

(second ''a') ;; => a' 


(rot13 "a") साथ , a एक श्रृंखला है। तारों को पात्रों में नहीं डाला जा सकता है, लेकिन उन्हें पात्रों के संग्रह के रूप में माना जा सकता है। तो, (rot13 (first "a")) इरादे के रूप में काम करेगा।

+0

धन्यवाद! यह निश्चित रूप से मदद करता है! – zaolian

+0

बस महसूस करें कि आपने बाद में संपादित किया था और इसमें अधिक सामान था। इसने डेटा समय के बारे में मेरे सभी सवालों को मंजूरी दी। बहुत बहुत धन्यवाद!! – zaolian

7

क्लोजर यदि आप अच्छी तरह से पूछते हैं तो अक्षरों को स्वचालित रूप से int में परिवर्तित कर देगा। यह इसे एसीआई समकक्ष (वास्तव में अच्छी तरह से यूनिकोड) का उपयोग करके परिवर्तित करेगा।

(int \a);;=>97 
(int \b);;=>98 
(int \c);;=>99 

हालांकि, अगर आप एक Clojure चार भी एक पूर्णांक या लंबे समय के लिए एक नंबर है कि परिवर्तित करना चाहते हैं:

(Character/digit \1 10) ;; => 1 
(Character/digit \2 10) ;; => 2 
(Character/digit \101 10) ;;=> 101 

एक गैर अंकों चार -1 में परिवर्तित हो जाएगा:

(Character/digit \a 10) ;;=> -1 

इस मामले में ठीक है, क्योंकि \-1 एक चरित्र नहीं है।

(Character/digit \-1 10);;=>java.lang.RuntimeException: Unsupported character: \-1 

यह भी सुविधाजनक ध्यान दें कि --1 बदल जाएगा हो सकता है, हालांकि मैं इस पर बहुत ज्यादा भरोसा नहीं घाव:

(Character/digit \- 10);;=>-1 

दूसरा पैरामीटर स्पष्ट रूप से आधार है। पूर्व:

(Character/digit \A 16);;=>10 
-1

सुनिश्चित नहीं है कि ऊपर लंबी चर्चा क्यों है।

(Integer/parseInt s) 
संबंधित मुद्दे