14

Clojureで文字をintにキャストするには?

私は rot 13 を clojure で書こうとしているので、char を int にキャストする何かが必要です。(int) というものを見つけたので、次のように入力します。

(int a)

Get: CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:13:1)

それから私は入れます:

(int 'a)

Get: ClassCastException clojure.lang.Symbol を `java.lang.Character clojure.lang.RT.intCast にキャストできない (RT.java:1087)

それで:

(rot13 ''a')

Get: 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)

それで、それを行う正しい方法は何ですか?

ところで、私はいつもこれらすべての clojure 構文で混乱します。しかし、私の問題を解決するだけの情報源を見つけることはできません。助言がありますか?ありがとうございました!!

4

3 に答える 3

21

Clojure は、適切に要求すれば、自動的に文字を int に変換します。asciiの同等性を使用して変換します(実際にはUnicodeです)。

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

ただし、数値でもある Clojure char を int または long に変換する場合は、次のようにします。

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

数字以外の文字は次のように変換され-1ます:

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

\-1はキャラクターではないので、この場合はどちらでも構いません。

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

-に変換されることに注意することも便利ですが-1、あまり依存していません。

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

2 番目のパラメーターは明らかにベースです。元 :

(Character/digit \A 16);;=>10
于 2015-10-15T20:27:50.297 に答える
12

あなたが探しているのは文字リテラル\aです。\文字リテラルは、リーダー マクロによってプレフィックスが付けられた単一の文字または 16 ビットの Unicode コード ポイントによって示されます。

(int \a) ;; => 97

(int \0) ;; => 48

(int \u0030) ;; => 48


(int a)aは記号です。そのため、ランタイムは、そのシンボルがバインドされているものを解決しようとしましたが、失敗しました。


With (int 'a),aもシンボルですが、一重引用符 ( ') を使用してシンボルとして宣言したため、ランタイムは文字どおりに受け取り、 を にキャストしようとしましたが失敗しましclojure.lang.Symboljava.lang.Character


(rot13 ''a')、シンボルとして'a'宣言します。a'ただし、余分な'プレフィックスを付けると、ランタイムはa'文字どおりに宣言された式を処理します。'a'に展開される(quote a')ため、「リテラル リテラル」''a'はリスト に展開されます(quote a')

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

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


(rot13 "a")a文字列です。文字列を文字にキャストすることはできませんが、文字のコレクションとして扱うことができます。したがって、(rot13 (first "a"))意図したとおりに機能します。

于 2013-11-03T03:53:23.407 に答える