2024年Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面获取更多关于如何使用本网站的信息。

+1 投票
Java Interop

我想确保我在float数组上使用非装箱和非反射算术,但是编译时却失败了。

如何在这个函数中对float进行类型注释呢?

`
(defn ff2a

^"[F" ; 返回类型注解为float数组

[^float f1 ^float f2] ; 参数类型注解

(float-array [f1 f2]))
`

当我将其加载到REPL中时,得到了这个错误

语法错误(IllegalArgumentException)编译fn* [...] 只支持long和double原始类型

1 个答案

+1 投票

从SO复制我的回答。

您无法这样做。错误非常明显。即使这个也失败了

user=> (defn f [^float x])
Syntax error (IllegalArgumentException) compiling fn* at (REPL:1:1).
Only long and double primitives are supported

您仍然可以使用非装箱 doubles。如果这不符合您的需求,可能最好在Java中实现这个特定部分。

该死。我不能用Clojure来做我的项目了。我需要密集的float数组。谢谢您的快速回答。
必须使用浮点数组并不意味着要对每个原生的浮点进行类型提示。很有可能,你仍然可以使用Clojure并获得与Java相当的性能。特别是考虑到像`tech.ml.dataset`这样的东西。
浮点数组是可以的,你只是不能传递原生的浮点(在这种情况下你需要使用双精度浮点数)。Clojure更喜欢双精度浮点数和长整数而不是浮点数和整数。数组和对象是正交的。

user=> (defn ff2a ^floats [^double f1 ^double f2] (float-array [f1 f2]))
#'user/ff2a
user=> (ff2a 1.2 3.4)
#object["[F" 0x50f40653 "[F@50f40653"]
user=> (seq *1)
(1.2 3.4)
...