Введите вывод подсказок для функций в Clojure

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

Что лучший способ состоит в том, чтобы решить это? Это может быть сделано с подсказками типа?

10
задан mikera 10 June 2010 в 21:40
поделиться

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

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

12
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: