2024 年 Clojure 状况调查!分享您的想法。

欢迎!有关如何操作,请参阅关于页面了解更多信息。

0
Spec
编辑
clj
Clojure 1.10.1
user=> (defmulti valid? (fn [x] (odd? x)))
#'user/valid?
user=> (defmethod valid? true [x] true)
#object[clojure.lang.MultiFn 0x184545fe "clojure.lang.MultiFn@184545fe"]
user=> (require '[clojure.spec.alpha :as s])
nil
user=> (s/def ::foo (s/and int? valid?))
:user/foo
user=> (s/conform ::foo 5)
5
user=> (s/unform ::foo 5)
Execution error (NullPointerException) at java.util.regex.Matcher/getTextLength (Matcher.java:1770).
null
user=> (pst *e)
NullPointerException
java.util.regex.Matcher.getTextLength (Matcher.java:1770)
java.util.regex.Matcher.reset (Matcher.java:416)
java.util.regex.Matcher.<init> (Matcher.java:253)
java.util.regex.Pattern.matcher (Pattern.java:1134)
clojure.lang.Compiler.demunge (Compiler.java:2936)
clojure.spec.alpha/fn-sym (alpha.clj:128)
clojure.spec.alpha/fn-sym (alpha.clj:124)
clojure.spec.alpha/fn--1809 (alpha.clj:145)
clojure.spec.alpha/fn--1809 (alpha.clj:130)
clojure.spec.alpha/fn--1782/G--1777--1791 (alpha.clj:121)
clojure.spec.alpha/specize (alpha.clj:152)
clojure.spec.alpha/specize (alpha.clj:151)

1 答案

+1

选定
 
最佳答案

是的,这是一个 spec 的 bug,未检查函数对象的类名是否符合预期模式(所有多重方法都只会报告 clojure.lang.MultiFn)。

此问题已在 spec 2 中修复(依靠符号规范,而不尝试以这种方式解释函数对象)。

...