请在 2024 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面以获取更多关于这个工作方式的信息。

+1 推荐
Java 互操作

我想确保我在使用浮点数数组的解包和无反射算术,但是我无法使其编译。

我该如何在函数中像这样对浮点数进行类型提示?

`
(defn ff2a

^"[F" ; 返回浮点数组类型提示

[^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

您仍然可以使用解包的双精度浮点数。如果这对您不起作用,您可能最好将此特定部分实现为 Java。

哎呀。我无法使用 Clojure 为我的项目。我需要密集的浮点数组。感谢您快速回答。
必须使用浮点数数组并不意味着需要对每个原始浮点数进行类型提示。很可能会仍然使用 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)
...