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 提供

这比类型提示更微妙:编译器不会在绑定vec中评估元数据。

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

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