我遇到了一些奇怪的异常行为,但我无法找到一个小的失败案例。
(defn quicksort [v]
(if (<= (count v) 1)
v
(let [[x & xs] v]
(rrb/catvec (quicksort (filterv #(<= % x) xs))
[x]
(quicksort (filterv #(> % x) xs))))))
我们可以使用 test.check 来检查这个实现
(defn ascending? [coll]
(every? (fn [[a b]] (<= a b))
(partition 2 1 coll)))
(def property
(prop/for-all [v (gen/vector gen/int)]
(let [s (quicksort v)]
(and (= (count v) (count s))
(ascending? s)))))
(tc/quick-check 10000 property)
;; => {:result true, :num-tests 10000, :seed 1440948212354}
我已经将检查次数提高到 1e6,但 test.check 无法找到失败的案例
然而,我不知道为什么,对于附带的 1193 个元素的向量,我收到了 "ClassCastException:clojure.lang.PersistentVector$Node 无法转换为 [I" 的错误。
{}
(quicksort (read-string (slurp "failing-1193.edn")))
{}