肺功能cluj

时间:2011-10-10 02:02:38

标签: clojure

我正在尝试使用longs函数,但它不起作用:

(println (longs 1 2 3))

任何例子?

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

由于

1 个答案:

答案 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)