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