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

欢迎!请查看 关于 页面以获取有关此功能的更多信息。

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

以下形式导致反射警告

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

但是,提示似乎在 vars 上工作正常

    (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 报告)
...