请在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](https://clojure.atlassian.net/browse/CLJ-1951) (由alexmiller报告)
...