2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以获取有关工作方式的更多信息。

0
编译器

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

`

1 回答

0
...