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中。

dreadfully. 我不能为我的项目使用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)
...