为了提示原始数据类型,如长整型,可以使用符号 '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__>
`