请分享您的看法,参加2024年Clojure调查!

欢迎!请参阅关于页面获取更多关于如何使用此功能的信息。

0
Clojure
添加{{bigint?}}和spec.gen支持。

这部分很容易


(defn bigint?
  "如果n是BigInt则返回true"
  {:added "1.9"}
  [n] (instance? clojure.lang.BigInt n))


生成器是复杂的一环。test.check没有为bigint提供生成器,只有{{large-integer}}用于long范围内的数据。我认为在bigint生成器中我们需要超long范围的数据(因为那里很可能是bug的起源)。制作一个具有良好增长和收缩特性的高质量bigint生成器需要更多思考。

http://clojure.github.io/test.check/clojure.test.check.generators.html#var-large-integer

4 个答案

0

评论作者:gfredericks

如果我没有时间补丁,我认为这样的生成器是一个不错的选择

`
(def gen-bigint
(gen/sized
(fn [size]

 (let [large-integer (gen/resize size gen/large-integer)] 
   ;; scaling gives us relatively small vectors, but using  
   ;; the resized large-integer above means the numbers in 
   ;; the small vectors will still be big 
   (gen/scale #(+ 2 (/ % 20))
              (gen/fmap (fn [xs] (+ (bigint (first xs)) (reduce * (map bigint (rest xs))))) 
                        (gen/not-empty (gen/vector large-integer)))))))) ```
0

评论作者:gfredericks

如果上述生成器的大小设置看起来有任何不足,我应该指出,test.check中的大小设置相当微妙,但要求也不明确。我很乐意详细讨论。

0

评论作者:gfredericks

作为一个更新,我整理了一个非常棒的bigint生成器,但是这个边缘太小了无法容纳。可能需要一些调整,但对于这些用途可能已经足够好。它还没有在test.check master中,但我预计很快就会是这样。

0
参考:https://clojure.atlassian.net/browse/CLJ-1951(由alexmiller报告)
...