2024 Clojure状态调查中分享您的观点!

欢迎!有关如何工作的更多信息,请参阅关于页面。

+1
编译器

当进行元数据评估时,例如在def的情况下,原始类型别名不会工作。

在这个例子中,char被解释为函数char,而不是类型别名。这是因为clojure.lang.Compiler$DefExpr$Parser.parse在符号上评估元数据。

(def ^char x \space) (String/valueOf x) => CompilerException java.lang.IllegalArgumentException: 无法解析类名:clojure.core$char@7b82f7d1

相反,您必须将其写成

(def ^Character/TYPE x \space)

但是,当使用内联原始类型提示时,它们可以正常工作

(def x \space) (String/valueOf ^char x)

原始类型别名应该得到一致的对待。

谷歌显示这似乎是一个众所周知的问题,但我尚未找到与之相关的Jira问题。

2 答案

0

评论者:alexmiller

Var元数据被评估。函数签名和其他位置的元数据则不会。这两个问题都是出于历史原因,但如果我们更改其中任何一个,那将是一个破坏性的更改,因此它们不会被更改。

一种可能的做法是在发生这个问题时检测到,并生成警告或错误。特别是,这会表现为一个var,其meta :tag是函数。

所以,如果您想将此问题重写为错误消息的请求,这是一个值得考虑的问题。

0
参考: https://clojure.atlassian.net/browse/CLJ-2072(由 alex+import 报告)
...