14

如何在 Clojure 中将字符转换为 int?

我正在尝试用 clojure 编写一个 rot 13,所以我需要一些东西来将我的 char 转换为 int。我发现了一个叫做(int)的东西,所以我放了:

(int a)

获取:CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compile:(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)

那么正确的方法是什么?

顺便说一句,我总是对所有这些 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

第二个参数显然是基数。前任 :

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

您正在寻找的是一个字符文字\a。字符文字由单个字符或 16 位 unicode 代码点表示,前缀为\reader 宏。

(int \a) ;; => 97

(int \0) ;; => 48

(int \u0030) ;; => 48


,(int a)a一个符号。因此,运行时尝试并未能解析该符号所绑定的内容。


With (int 'a),a也是一个符号,但是,因为你用单引号 ( ') 声明它是一个符号,运行时按字面意思理解它并尝试将它clojure.lang.Symbol转换为 a ,但失败了java.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 回答
-1

不知道为什么上面的长时间讨论。

(Integer/parseInt s)
于 2018-03-04T19:54:39.210 回答