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