当我在协议实现内部调用多方法时,我收到一个长的错误。
包含错误输出的最小工作示例
https://github.com/exi/core-typed-errors
代码
(ns example.core
(:import java.io.File)
(:require [clojure.core.typed :as t]))
(declare dispatcher)
(t/ann-protocol MProto
myfn (t/IFn [MProto File -> String]))
(defprotocol MProto
(myfn [this obj]))
(t/ann-record MRec [name :- String])
(defrecord MRec [name]
MProto
(myfn [this obj] (dispatcher this obj)))
(t/ann dispatcher (t/IFn [MRec File -> String]))
(defmulti dispatcher (fn [rec obj] (class obj)))
(defmethod dispatcher
File
[rec obj]
(:name rec))
(defn -main [& args]
(let [rec (MRec. "myname")
file (File. ".")]
(when (not (nil? file))
(println (myfn rec file)))))
错误信息
初始化 core.typed ...
构建 core.typed 基础环境 ...
已构建基础环境
"耗时:3564.305528 毫秒"
core.typed 已初始化。
开始收集 example.core
已收集 example.core
收集了 1 个命名空间,耗时 681.706266 毫秒
不检查 clojure.core.typed(不依赖于 clojure.core.typed)
开始检查 example.core
nil 不检查 example.core/MProto 定义
13: 不检查 example.core/->MRec 定义
已检查 example.core,耗时 1019.900549 毫秒
WARNING: 类型检查器:缺少定义:clojure.core/assert-same-protocol
提示:如果这是一个未检查的变量,请使用 :no-check 元数据与 ann
WARNING: 类型检查器:缺少定义:clojure.core/-cache-protocol-fn
提示:如果这是一个未检查的变量,请使用 :no-check 元数据与 ann
WARNING: 类型检查器:缺少定义:clojure.core/-reset-methods
提示:如果这是一个未检查的变量,请使用 :no-check 元数据与 ann
已检查 2 个命名空间,耗时 1717.619162 毫秒
类型错误(example/core.clj:9:1)多态函数 clojure.core/alter-meta! 无法应用于参数
多态变量
b
范围
clojure.lang.IReference [(t/U nil (IPersistentMap t/Any t/Any)) b ... b -> (t/U nil (IPersistentMap t/Any t/Any))] b ... b
参数
(Var t/Any t/Any) (t/All [b c d] (t/IFn [(t/Map b c) b c -> (t/Map b c)] [(t/Vec d) t/AnyInteger d -> (t/Vec d)])) (t/Val :doc) nil
范围
(t/U nil (IPersistentMap t/Any t/Any))
在:(clojure.core/alter-meta! (var example.core/MProto) clojure.core/assoc :doc nil)
在:(clojure.core/alter-meta! (var example.core/MProto) clojure.core/assoc :doc nil)
类型错误(example/core.clj:9:1)未类型化变量引用:clojure.core/assert-same-protocol
提示:通过 check-ns 或 cf 添加 clojure.core/assert-same-protocol 的注释
在: (var clojure.core/assert-same-protocol)
类型错误 (example/core.clj) 无法在类型 clojure.core.typed/Any 上调用示例.core.MProto/myfn 实例方法
在: (.myfn gf__this__763 gf__obj__764)
类型错误 (example/core.clj) 示例.core.MProto/myfn 实例方法无法应用于参数
范围
对象
参数
t/Any
范围
(t/U nil Object)
在: (.myfn gf__this__763 gf__obj__764)
在: (.myfn gf__this__763 gf__obj__764)
类型错误 (example/core.clj) 预期 __methodImplCache 字段是 clojure.lang.AFunction,实际是 [clojure.core.typed/Any clojure.core.typed/Any -> clojure.core.typed/Any]
在: (.-__methodImplCache G__753)
类型错误 (example/core.clj) 静态方法 clojure.lang.Util/classOf 无法应用于参数
范围
对象
参数
t/Any
范围
(t/U nil Class)
在: (clojure.lang.Util/classOf gf__this__766)
在: (clojure.lang.Util/classOf gf__this__766)
类型错误 (example/core.clj) 无法在类型 (clojure.core.typed/U nil clojure.lang.MethodImplCache) 上调用实例方法 clojure.lang.MethodImplCache/fnFor
在: (.fnFor cache__5915__auto__ (clojure.lang.Util/classOf gf__this__766))
类型错误 (example/core.clj) 无法调用类型:IFn
在: (f__5916__auto__ gf__this__766 gf__obj__767)
类型错误 (example/core.clj) 未注释的变量 clojure.core/-cache-protocol-fn
提示:通过 check-ns 或 cf 添加 clojure.core/-cache-protocol-fn 的注释
在: clojure.core/-cache-protocol-fn
类型错误 (example/core.clj) __methodImplCache 实例字段预期为 clojure.lang.AFunction,实际是 [clojure.core.typed/Any clojure.core.typed/Any -> Error]
在: (.-__methodImplCache f__5918__auto__)
类型错误 (example/core.clj) 类型不匹配
预期: (t/U nil MethodImplCache)
实际: t/Any
在: cache__5917__auto__
类型错误 (example/core.clj:9:1) 多态函数 clojure.core/alter-var-root 无法应用于参数
多态变量
w
r
b
范围
(t/Var2 w r) [r b ... b -> w] b ... b
参数
(Var t/Any t/Any) (t/All [k v] (t/IFn [nil * -> nil] [(clojure.lang.IPersistentMap k v) (clojure.lang.IPersistentMap k v) * -> (clojure.lang.IPersistentMap k v)] [(t/Option (clojure.lang.IPersistentMap k v)) * -> (t/Option (clojure.lang.IPersistentMap k v))])) (t/HMap :mandatory {:method-builders (APersistentMap (t/Var2 t/Nothing t/Any) [t/Any -> [t/Any t/Any -> Error] :filters {:then tt, :else ff}]), :method-map (t/HMap :mandatory {:myfn (t/Val :myfn)} :complete? true), :var (Var t/Any t/Any), :sigs (t/HMap :mandatory {:myfn (t/HMap :mandatory {:file (t/Val "example/core.clj"), :line (t/Val 10), :column (t/Val 4), :end-line (t/Val 10), :end-column (t/Val 9), :name (t/Val myfn), :arglists (ISeq (t/HVec [(t/Val this) (t/Val obj)])), :doc nil} :complete? true)} :complete? true), :on (t/Val example.core.MProto), :on-interface (t/Val example.core.MProto)} :complete? true)
范围
w
在: (clojure.core/alter-var-root (var example.core/MProto) clojure.core/merge (clojure.core/assoc {:on (quote example.core/MProto), :on-interface example.core/MProto} :sigs (quote {:myfn {:doc nil, :arglists ([this obj]), :name myfn, :end-column 9, :end-line 10, :column 4, :line 10, :file "example/core.clj"}}) :var (var example.core/MProto) :method-map {:myfn :myfn} :method-builders {(clojure.core/intern clojure.core/*ns* (clojure.core/with-meta (quote myfn) (clojure.core/merge (quote {:doc nil, :arglists ([this obj]), :name myfn, :end-column 9, :end-line 10, :column 4, :line 10, :file "example/core.clj"}) {:protocol (var example.core/MProto)}))) (fn* ([cache__5917__auto__] (let* [G__754 (fn* ([gf__this__763 gf__obj__764] (.myfn gf__this__763 gf__obj__764))) f__5918__auto__ (fn* G__753 ([gf__this__766 gf__obj__767] (let* [cache__5915__auto__ (.-__methodImplCache G__753) f__5916__auto__ (.fnFor cache__5915__auto__ (clojure.lang.Util/classOf gf__this__766))] (if f__5916__auto__ (f__5916__auto__ gf__this__766 gf__obj__767) ((clojure.core/-cache-protocol-fn G__753 gf__this__766 example.core.MProto G__754) gf__this__766 gf__obj__767)))))] (do (set! (.-__methodImplCache f__5918__auto__) cache__5917__auto__) f__5918__auto__))))})
在: (clojure.core/alter-var-root (var example.core/MProto) clojure.core/merge (clojure.core/assoc {:on (quote example.core/MProto), :on-interface example.core/MProto} :sigs (quote {:myfn #}) :var (var example.core/MProto) ...))
类型错误 (example/core.clj) 未注释的变量 clojure.core/-reset-methods
提示:通过 check-ns 或 cf 添加 clojure.core/-reset-methods 的注释
在: clojure.core/-reset-methods
类型检查器:发现 13 个错误
发现错误
子进程失败