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。

因此,如果您希望将此问题重写为一个错误消息请求,这也是值得考虑的。

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