2013-11-03 3 views
5

Clojure에서 문자를 int로 변환하는 방법은 무엇입니까?Clojure에서 문자를 int로 변환하는 방법은 무엇입니까?

나는 clojure에 썩은 꼴 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") 

Get :

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

그래서 올바른 방법은 무엇입니까?

btw, 나는 항상 이러한 모든 clojure 구문과 혼동스러워합니다. 하지만 어떤 문제도 내게 도움이되는 소스는 찾을 수 없습니다. 어떤 제안? 고맙습니다!!

+3

나는 '\ a'와 같은'문자 리터럴 '(http://clojure.org/reader)을 찾고 있다고 생각합니다. (오류 메시지는 정수가 아닌 문자를 원한다고 말합니다) . – user2864740

+0

감사합니다. 그게 내 문제를 해결해 줬어. stackoverflow에 처음으로 이것은 좋은 장소입니다! – zaolian

+1

[documentation] (http://clojure.org/documentation)을 사용하십시오. 특히 [독자] (http://clojure.org/reader)와 관련이 있습니다. –

답변

8

당신이 찾고있는 것은 문자 리터럴 \a입니다. 문자 리터럴은 단일 문자 또는 16 비트 유니 코드 코드 포인트로 표시되며 \ 독자 매크로가 앞에 표시됩니다. (int a) 함께

(int \a) ;; => 97 

(int \0) ;; => 48 

(int \u0030) ;; => 48 


, a는 심볼이다. 따라서 런타임은 해당 심볼이 바인딩 된 대상을 확인하려고 시도했지만 실패했습니다. 당신이 작은 따옴표 (')와 기호 선언 때문에 (int 'a)


, a은 또한 상징이지만, 런타임은 문자 그대로 그것을 가져다가 시도하고 faild는 java.lang.Characterclojure.lang.Symbol를 캐스팅.


(rot13 ''a')으로, 'a'a'을 기호로 선언합니다. 그러나 여분의 ' 접두사를 붙이면 런타임에서 a'을 그대로 사용하는식이 처리됩니다. 'a'(quote a')으로 확장되므로 "리터럴 리터럴"인 ''a'(quote a')으로 확장됩니다. (rot13 "a")

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

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


, a은 문자열입니다. 문자열은 문자로 변환 할 수 없지만 문자의 모음으로 처리 할 수 ​​있습니다. 따라서 (rot13 (first "a"))은 의도 한대로 작동합니다.

+0

감사합니다. 그게 분명 도움이됩니다! – zaolian

+0

나중에 편집하고 더 많은 자료가 있다는 것을 알고 있습니다. 이것은 데이터 시간에 관한 나의 모든 질문을 해결했습니다. 정말 고맙습니다!! – zaolian

7

Clojure는 사용자가 부탁하면 자동으로 문자를 int로 변환합니다. 그것은 ascii 등가성을 사용하여 변환 할 것입니다 (실제로는 잘 유니 코드입니다).

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

그러나, 당신은 또한 int 또는 long에 다수 인의 Clojure 문자로 변환하려면 다음과 같이 숫자가 아닌 문자가 -1로 변환됩니다

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

:

(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) 
관련 문제