Clojure синтаксис вопрос re: # ^
в игре Rich Hickeys ant у него есть следующий код:
(import
'(java.awt Color Graphics Dimension)
'(java.awt.image BufferedImage)
'(javax.swing JPanel JFrame))
(defn fill-cell [#^Graphics g x y c]
(doto g
(.setColor c)
(.fillRect (* x scale) (* y scale) scale scale)))
Я не могу найти документацию в любом месте, что означает # ^ в этом контексте, любая помощь была оценена.
Ответы
Ответ 1
#^
- это старый синтаксис для макроса чтения метаданных. Синтаксис изменился на ^
в clojure 1.2. См. http://clojure.org/reader. В вашем примере #^Graphics
представляет подсказку типа которая используется по соображениям производительности.
Ответ 2
#^
- это "подсказка типа" - он сообщает Clojure, в каком классе будет аргумент. В последних версиях Clojure вы можете просто сказать ^Graphics
вместо #^Graphics
. Подробнее см. Clojure Java Interop - Type Hints. Цитата с этого сайта:
Clojure поддерживает использование подсказок типа, чтобы помочь компилятору избежать отражения в критически важных областях кода. Как правило, следует избегать использования подсказок типа, пока не появится известное узкое место производительности. Тип подсказок - это теги метаданных, помещенные в символы или выражения, которые потребляются компилятором. Они могут быть размещены на функциональных параметрах, именах с привязкой, имена переменных (если они определены) и выражения