我正在尝试使用longs
函数,但它不起作用:
(println (longs 1 2 3))
任何例子?
网站上的描述不是很好,这就是我遇到问题的原因 http://clojure.org/cheatsheet
由于
答案 0 :(得分:5)
你的问题非常不完整,但无论如何我都会捅它。
longs
的文档说:
用法:(longs xs)
这意味着,它期待一个参数(在此示例中名为xs
)。你传递了三个论点。
longs
的文档因此继续:
投射到
long[]
转换意味着:它不会更改xs,它只是检查它是一个原始long
数组,然后将此信息提供给编译器。基本上,在long[]
中包装生成(longs ...)
的表达式是Clojure的类型提示,因此它不必在运行时使用反射来解析使用该值作为参数的方法调用: / p>
// Suppose we have a java class
class JavaClass {
static long[] getSomeLongs() { ... }
static long sum(long[] numbers) { ... }
static float sum(float[] numbers) { ... }
}
;; And this Clojure code:
(defn numbers [] (JavaClass/getSomeLongs))
(JavaClass/sum (numbers))
Clojure是动态类型的,所以当它编译第二行时,它不会知道(数字)返回一个long数组。它必须等到运行时间,然后使用反射查找正确的JavaClass / sum方法。这很贵。
解决方案是给Clojure编译器一个关于(数字)类型的提示。这样它就可以选择在编译时调用的正确方法,从而使程序运行得更快:
(JavaClass/sum (longs (numbers)))
但是,从你可疑的不完整的问题来看,这可能不是你达到longs
时所期望的。看来你希望它能从你给它的参数中创建一长串数组。如果这就是你想要的,那就用这个:
(into-array Long/TYPE [1 2 3])
但是,您可能会对打印结果感到失望:
user=> (println (into-array Long/TYPE [1 2 3]))
#<long[] [J@2321b59a>
当你要求它将一个数组转换为一个String时,这就是Java所给出的,这就是Clojure打印的内容。如果要查看打印回来的数组的内容,则需要创建一个序列:
user=> (println (seq (into-array Long/TYPE [1 2 3])))
(1 2 3)