为了提示原语,例如长整型,您可以使用符号'long。在一些地方,您也可以使用类对象java.lang.Long/TYPE。然而,在某些地方,这样不行。这在使用宏进行提示时尤其成问题,因为微小的更改可能影响元数据的评估时间,从而改变提示是否被尊重。
`
user=> (set! unchecked-math :warn-on-boxed)
:warn-on-boxed
user=> (defmacro mac []
(let [field (with-meta 'x {:tag 'long})]
(-> field meta :tag class prn)
`(deftype Foo# [~field]
clojure.lang.IDeref
(deref [this#]
(inc ~(with-meta field nil))))))
'user/mac
user=> (mac)
clojure.lang.Symbol
<java.lang.Class@1c76c583 class user.Foo13651auto__>
user=> (defmacro mac []
(let [field (with-meta 'x {:tag java.lang.Long/TYPE})]
(-> field meta :tag class prn)
`(deftype Foo# [~field]
clojure.lang.IDeref
(deref [this#]
(inc ~(with-meta field nil))))))
'user/mac
user=> (mac)
java.lang.Class
boxed math warning,/private/var/folders/43/mnwlkd2s7r1gbjwq6t__mgt40000gn/T/form-init5463347341158437534.clj:1:1 - call:public static java.lang.Number clojure.lang.Numbers.unchecked_inc(java.lang.Object).
<java.lang.Class@74626b21 class user.Foo13663auto__>
`