longs functiooon cloj

and*_*dre -5 clojure

我正在尝试使用该longs功能,但它不起作用:

(println (longs 1 2 3))
Run Code Online (Sandbox Code Playgroud)

任何例子?

网站上的描述不是很好,这就是为什么我遇到问题 http://clojure.org/cheatsheet

谢谢

ben*_*din 5

你的问题非常不完整,但无论如何我都会捅它.

文档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)