Тип подсказки для функций в Clojure - PullRequest
10 голосов
/ 11 июня 2010

Я пытаюсь разрешить предупреждение о отражении в 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

Каков наилучший способ решить эту проблему?Можно ли это сделать с помощью подсказок типа?

1 Ответ

12 голосов
/ 11 июня 2010

Похоже, что эти две версии работают:

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

Обратите внимание, что в Clojure сейчас хинтинг типов все еще находится в движении, что приводит к выпуску 1.2, так что это может не работать вечно.Также обратите внимание, что #^ устарела в пользу ^.

...