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)
...