2024 年 Clojure 状态调查!中分享您的看法。

欢迎!请参阅关于页面,以了解有关此工具的更多信息。

0
core.typed
h1. 问题

HVec 的谓词生成不支持统一的可变参数。


((t/pred (t/HVec [(t/Value :foo) t/Keyword *])) [:foo :bar])
CompilerException clojure.lang.ExceptionInfo: 内部错误 (*cider-repl service*:97:17) :在类型->pred 中不支持协议: * {:type-error :clojure.core.typed.errors/internal-error, :env {:line 97, :column 17, :file "*cider-repl service*", :ns spark.dev.repl}}, 编译:(*cider-repl service*:97:17)


h1. 解决方案

这看起来像是 {{*}} 未正确解析的症状。

首先,{{HVec}} 显然忽略了可变参数[当它们被解析时|https://github.com/clojure/core.typed/blob/0947387913babb0e8db52b560a3c0e42b45cb40b/module-rt/src/main/clojure/clojure/core/typed/parse_ast.clj#L249-L275].

这实际上在引号化的 HVec 类型[像 '[Foo Bar *] [这里|https://github.com/clojure/core.typed/blob/0947387913babb0e8db52b560a3c0e42b45cb40b/module-rt/src/main/clojure/clojure/core/typed/parse_ast.clj#L344-L345]

此更改应可解决问题;合约生成已经为引号化的 HVec 运行良好,因为它期望存在[更多条目|https://github.com/clojure/core.typed/blob/0947387913babb0e8db52b560a3c0e42b45cb40b/module-rt/src/main/clojure/clojure/core/typed/type_contract.clj#L81-L86]

*Pull request*
*Commit*
*Version*

3 答案

0

由: ambrosebs

错误有点奇怪。可能是 {{t/Keyword}} 导致了这个问题。

请尝试隔离此问题。

0

由: ambrosebs

哦,我明白了问题所在。无法解析名为 ** 的协议!

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