【发布时间】:2015-06-20 13:40:19
【问题描述】:
我正在使用 slingshot 的 throw+ 宏来引发如下异常:
(throw+ {:type ::urlparse})
类型检查器不喜欢它:
Type Error (stream2es/http.clj:79:17) Bad arguments to apply:
Target: [String t/Any * -> String]
Arguments: (PersistentList String)
in: (clojure.core/apply clojure.core/format (clojure.core/list "throw+: %s" (clojure.core/pr-str %)))
Type Checker: Found 1 error
macro in slingshot 看起来像:
(defmacro throw+
([object]
`(throw+ ~object "throw+: %s" (pr-str ~'%)))
([object message]
`(throw+ ~object "%s" ~message))
([object fmt arg & args]
`(let [environment# (s/environment)
~'% ~object
message# (apply format (list ~fmt ~arg ~@args))
stack-trace# (s/stack-trace)]
(s/throw-context ~'% message# stack-trace# environment#)))
([]
`(s/rethrow)))
我在apply 和format 上尝试了各种ann ^:no-check 表单,但没有一个有效。由于它是一个宏,我假设我不能注释它,因为它替换了那里的代码。但我也无法像this other answer 中建议的那样重写宏中的代码,因为它在库中。在这种情况下如何逐渐输入?
【问题讨论】:
标签: clojure clojure-core.typed