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

欢迎!请查看关于页面了解有关如何操作的更多信息。

0
编译器
类型提示在绑定形式中未按预期工作。

以下形式导致反射警告:

    (let [^{:tag (Class/forName "[Ljava.lang.Object;")} a (make-array Object 2)]
      (aget a 0))

然而,提示似乎在变量上正确工作

    (def ^{:tag (Class/forName "[Ljava.lang.Object;")} a (make-array Object 2))
    (aget a 0) ;;无反射警告

3 答案

0

评论者:gshayban

这比类型提示更为狡猾:编译器在绑定向量中不评估元数据。

这不会抛出必要的异常...

(let (link: ^{:foo (Class/forName "not real")} bar 42)
bar)

也没有这个...

(let (link: ^{gyorgy ligeti} a 42)
a)

我院没有解决 Gyorgy Ligeti。

这两个等效示例不反映
(let (link: ^objects a (make-array Object 2))
(aget a 0))

(let (link: a ^objects (make-array Object 2))
(aget a 0))

0

评论者:gshayban

在局部绑定的左侧,不分析或评估符号上的元数据。

0
参考: https://clojure.atlassian.net/browse/CLJ-1136(由lvanderhart报告)
...