Clojure语法问题重新:#^

Chr*_*isR 11 clojure

在Rich Hickeys蚂蚁游戏中,他有以下代码:

(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)))
Run Code Online (Sandbox Code Playgroud)

我无法在任何地方找到文档#^意味着在这种情况下,任何帮助表示赞赏.

mty*_*aka 11

#^是元数据读取器宏的旧语法.语法已更改为^clojure 1.2.见http://clojure.org/reader.在您的示例中,#^Graphics表示由性能原因使用的类型提示.


Ger*_*ert 8

#^是一个"类型提示" - 它告诉Clojure参数将是什么类.在最近版本的clojure中你可以说^Graphics而不是#^Graphics.有关更多信息,请参阅Clojure Java Interop - 类型提示.来自该网站的报价:

Clojure支持使用类型提示来帮助编译器避免在性能关键的代码区域中反映.通常,在存在已知性能瓶颈之前,应避免使用类型提示.类型提示是放置在编译器使用的符号或表达式上的元数据标记.它们可以放在函数参数,let-bound名称,var名称(定义时)和表达式上