2013-11-03 12 views
5

Come trasmettere un carattere a int in Clojure?Come lanciare un personaggio in int in Clojure?

Sto provando a scrivere un rot 13 in clojure, quindi ho bisogno di avere qualcosa per trasmettere il mio char a int. Ho trovato qualcosa chiamato (int), così ho messo:

(int a) 

Get: CompilerException java.lang.RuntimeException: Impossibile risolvere il simbolo: una, in questo contesto, la compilazione: (NO_SOURCE_PATH: 13: 1)

poi ho messo:

(int 'a) 

Get: ClassCastException clojure.lang.Symbol non può essere lanciato a `java.lang.Character clojure.lang.RT.intCast (RT.java:1087)

Poi:

(rot13 ''a') 

Get: ClassCastException clojure.lang.PersistentList non può essere lanciato a java.lang.Character clojure.lang.RT.intCast (RT.java:1087)

E:

(rot13 "a") 

Get:

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

Allora, qual è il modo giusto per farlo?

btw, mi confondo sempre con tutte queste sintassi del clojure. Ma non riesco mai a trovare alcuna fonte solo aiutarmi con il mio problema. Eventuali suggerimenti? Grazie!!

+3

Credo che alla ricerca di una [ "carattere letterale"] (http://clojure.org/reader) come '\ a' (il messaggio di errore dice che vuole un carattere, non un intero) . – user2864740

+0

Grazie! Questo risolve il mio problema. La prima volta su StackOverflow e questo è un buon posto! – zaolian

+1

Utilizzare la [documentazione] (http://clojure.org/documentation), in particolare per quanto riguarda [reader] (http://clojure.org/reader). –

risposta

8

Quello che stai cercando è un personaggio letterale \a. Un carattere letterale è denotato da un singolo carattere, o codice unicode a 16 bit, preceduto dalla macro del lettore \.

(int \a) ;; => 97 

(int \0) ;; => 48 

(int \u0030) ;; => 48 


Con (int a), a è un simbolo. In quanto tale, il runtime ha provato e non è riuscito a risolvere ciò a cui quel simbolo era associato.


Con (int 'a), a è anche un simbolo, ma, perché si dichiarò un simbolo con l'apostrofo ('), il runtime ha preso alla lettera e ha cercato e faild di esercitare la clojure.lang.Symbol ad un java.lang.Character.


Con (rot13 ''a'), 'a' dichiara a' come simbolo. Ma il prefisso extra ' fa sì che il runtime consideri letteralmente l'espressione che ha dichiarato a'. 'a' si espande a (quote a'), quindi il "letterale letterale", ''a', si espande nell'elenco (quote a').

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

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


Con (rot13 "a"), a è una stringa. Le stringhe non possono essere trasmesse ai caratteri, ma possono essere trattate come raccolte di caratteri. Quindi, (rot13 (first "a")) funzionerebbe come previsto.

+0

Grazie! Questo sicuramente aiuta! – zaolian

+0

Ti rendi conto che hai modificato più tardi e hai avuto più materiale. Questo ha chiarito tutte le mie domande sul tempo dei dati. Grazie mille!! – zaolian

7

Clojure convertirà automaticamente i caratteri in int se chiedete gentilmente. Lo convertirà usando l'equivalenza ascii (in effetti unicode).

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

Tuttavia, se si desidera convertire un char Clojure che è anche un numero per un int o lunghi:

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

A char non cifre, verrà convertita in -1:

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

Che va bene in questo caso, poiché \-1 non è un carattere.

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

Potrebbe essere conveniente anche notare che - sarebbe convertire -1, anche se non ferita affidamento su troppo:

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

Il secondo parametro è ovviamente la base. Es:

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

Non so perché le lunghe discussioni sopra.

(Integer/parseInt s)