zao*_*ian 8 lisp functional-programming clojure
如何在Clojure中将字符强制转换为int?
我试图在clojure中写一个rot 13,所以我需要有一些东西将我的char转换为int.我找到了一个名为(int)的东西,所以我把:
(int a)
获取:CompilerException java.lang.RuntimeException:无法解析符号:a在此上下文中,编译:(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语法感到困惑.但我永远找不到任何来源只能帮助我解决我的问题.有什么建议?谢谢!!
nha*_*nha 13
如果你问得很好,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
Jar*_*314 10
你在寻找的是一个字符文字\a.字符文字由单个字符或16位unicode代码点表示,以\读取器宏为前缀.
(int \a) ;; => 97
(int \0) ;; => 48
(int \u0030) ;; => 48
随着(int a),a是一个象征.因此,运行时尝试并且无法解析该符号绑定的内容.
with (int 'a),a也是一个符号,但是,因为你用单引号(')声明它是一个符号,运行时从字面上看它并尝试并使用faild来转换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"))会按预期工作.