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