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
参考:[https://clojure.atlassian.net/browse/CLJ-1577](https://clojure.atlassian.net/browse/CLJ-1577)(bbloom报告)
...