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

时间:2013-11-03 03:46:28

标签: clojure functional-programming lisp

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

我正在尝试在clojure中编写一个rot 13,所以我需要有一些东西将我的char转换为int。我找到了一个名为(int)的东西,所以我把:

(int a)

Get:CompilerException java.lang.RuntimeException:无法解析符号:a在此上下文中,编译:(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语法感到困惑。但我永远找不到任何来源只能帮助我解决我的问题。有什么建议?谢谢!!

3 个答案:

答案 0 :(得分:12)

如果你问得好,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
(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 :(得分:10)

您要找的是字符文字\a。字符文字由单个字符或16位unicode代码点表示,前缀为\阅读器宏。

(int \a) ;; => 97

(int \0) ;; => 48

(int \u0030) ;; => 48


使用(int a)时,a是一个符号。因此,运行时尝试并且无法解析该符号绑定的内容。


对于(int 'a)a也是一个符号,但是,因为您将其声明为带有单引号(')的符号,所以运行时从字面上理解它并尝试并使用faild来转换{ {1}}到clojure.lang.Symbol


使用java.lang.Character(rot13 ''a')'a'声明为符号。但是,额外的a'前缀会使运行时处理从字面上声明'的表达式。 a'扩展为'a',因此“文字文字”(quote a')会扩展到列表''a'

(quote a')


使用''a' ;; => (quote a') (second ''a') ;; => a' 时,(rot13 "a")是一个字符串。字符串不能转换为字符,但可以将它们视为字符集合。因此,a可以按预期工作。

答案 2 :(得分:-1)

不确定为何上述长篇讨论。

(Integer/parseInt s)