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

欢迎!请参阅关于页面以获取更多有关如何使用本服务的信息。

+1
编译器

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

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

(def ^char x \space) (String/valueOf x) => CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: clojure.core$char@7b82f7d1

而是,必须这样编写

(def ^Character/TYPE x \space)

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

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

原始类型别名应始终一致处理。

谷歌搜索显示,这似乎是一个已知的问题,但我还没有找到一个 Jira 问题。

2 答案

0

评论者:alexmiller

Var meta是评估的。函数签名和其他位置的meta没有评估。出于历史原因,这两者都是这样,但如果我们更改其中任何一个,那将是破坏性的更改,因此它们不会发生变化。

我们可以做的一件事是在出现此特定问题时检测它并创建一个警告或错误。特别是,这会表现为一个其meta :tag是函数的var。

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

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