2024年Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面以获取更多关于此功能的详细信息。

0投票
Spec

是否觉得在fspec中添加一个新的kwarg,允许函数规范在函数的不同调用中提供一条或多条约束,例如交换性很有用。我正在做这个,但想看看是否有人觉得这很有用。

新的kwarg可能是:alg,因为这个选项允许表达函数的代数属性,它将接受一个映射,其中键命名为关键字,值是谓词(通常需要一个let)。

像下面这样,看起来像几个二元操作符

(s/fdef add

:args (s/cat :x int? :y int?)
:ret int?
:alg { :comm

        (let [f (:f %)
                x  (-> % args :x)
                y  (-> % args :x)]
               (= ((f x y) (f y x))

        :assoc 
        (let [f (:f %)
                x  (-> % args :x)
                y  (-> % args :x)
                z  (-> % args :x)]
                (= (f (f x y) z) (f x (f y z)))

        :ident   
        (let [f (:f %)
                x (-> % args :x)]
               (= (f x 0) x))})

(s/fdef mul
:args (s/cat :x int? :y int?)
:ret int?
:alg { :comm

        (let [f (:f %)
                x  (-> % args :x)
                y  (-> % args :x)]
               (= ((f x y) (f y x))

        :assoc 
        (let [f (:f %)
                x  (-> % args :x)
                y  (-> % args :x)
                z  (-> % args :x)]
                (= (f (f x y) z) (f x (f y z)))

        :ident   
        (let [f (:f %)
                x (-> % args :x)]
               (= (f x 0) x))

        :super
        (let [f (:f %)
                x (-> % args :x)]
               (= (f x 0) 0))})

(s/fdef max
:args (s/cat :x int? :y int?)
:ret int?
:alg { :comm

        (let [f (:f %)
                x  (-> % args :x)
                y  (-> % args :x)]
               (= ((f x y) (f y x))

        :assoc 
        (let [f (:f %)
                x  (-> % args :x)
                y  (-> % args :x)
                z  (-> % args :x)]
                (= (f (f x y) z) (f x (f y z)))

        :idem
        (let [f (:f %)
                x (-> % args :x)]
                (= (f x x) x)})

:ident, :super和:idem上面可以通过:fn来实现,但似乎在实际操作中放在一起会更方便。

这可能会引发一个问题:如何类似地处理相关函数集中或不变式的约束,尽管这可能不太常用。然而,这可能表明实际上应该将此与fspec分开,在单独的spec中实现 - ?

1 答案

0投票

你试图解决什么问题?

老实说,没有真正要解决的问题 - 我是一个基于属性的/生成性测试的爱好者,因此我已经将这些作为相关函数的测试。

然而,我喜欢规范,它似乎对我来说用fspec提供这种规范风格的信息很不错,并从中驱动相同的测试。

我对Clojure的使用还不是很熟悉,正努力挑一些问题来深入学习,并挑战自己;所以我主要想知道这是否有用,或者这只是我自己。
...