Clojure 中函数的类型提示

Posted

技术标签:

【中文标题】Clojure 中函数的类型提示【英文标题】:Type hinting for functions in Clojure 【发布时间】:2011-03-02 09:49:45 【问题描述】:

我正在尝试解决 Clojure 中的反射警告,该警告似乎是由于对作为普通 Java 对象的函数返回值缺乏类型推断造成的。

演示该问题的简单示例代码:

(set! *warn-on-reflection* true)    

(defn foo [#^Integer x] (+ 3 x))

(.equals (foo 2) (foo 2))

=> Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved.
   true

解决此问题的最佳方法是什么?这可以通过类型提示来完成吗?

【问题讨论】:

您使用的是哪个版本的 Clojure?我在我的 Clojure v1.0 中尝试了您的示例,它似乎工作正常...... 这是一个 clojure 1.2 版本。请注意,警告仅显示为 (set!warn-on-reflection true),这可能有所不同...。编辑问题以使其更清晰 是的,就是这样。我现在看到了。 【参考方案1】:

这两个版本似乎可以工作:

user> (defn foo [^Integer x] (+ 3 x))
#'user/foo
user> (.equals (foo 2) (foo 2))
Reflection warning, NO_SOURCE_FILE:1 - call to equals can't be resolved.  ;'
true
user> (.equals ^Integer (foo 2) ^Integer (foo 2))
true
user> (defn ^Integer foo [^Integer x] (+ 3 x))
#'user/foo
user> (.equals (foo 2) (foo 2))
true

请注意,在 1.2 版本之前,Clojure 中的类型提示仍然有点变化,所以这可能不会永远以同样的方式工作。另请注意,#^ 已被弃用,取而代之的是 ^

【讨论】:

太好了,非常感谢!也很高兴了解不断变化的语法......我猜生活在最前沿的乐趣:-) 太棒了!期待使用它来加速我的代码:)

以上是关于Clojure 中函数的类型提示的主要内容,如果未能解决你的问题,请参考以下文章

在 Clojure 中类型提示一个 nil 文字

尽管在 Clojure 中对 Java 构造函数有类型提示,但仍会出现反射警告

卡在 clojure 中的泛型类类型提示

Clojure : 类型提示塔

类型提示存储为clojure中的元数据?

为啥 Clojure 编译器不会为不正确的类型提示抛出错误?