请在2024年Clojure调查!中分享您的想法。

欢迎!请查看关于页面以获取更多关于这是如何工作的信息。

0
Spec

添加一个新的kwarg到fspec,是否似乎有用,以便函数规范可以在函数的不同调用之间提供或保持一个或多个约束或不变量,从而提供如交换性之类的约束?我正在研究这个,但认为最好检查是否还有人认为这是有用的。

这个新的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 实现,但似乎在放置::comm 和 :assoc 后将其放在一起会更方便。

这可能会引发关于如何类似地处理对一组相关函数进行或不变量的约束的问题,尽管这可能不太常用。然而,这可能表明实际上这最好作为fspec之外的单独规范来完成,?

1

0

您正在尝试解决什么问题?

by
老实说,没有真正需要解决的问题 - 我对基于属性/生成测试情有独钟,因此我已经将这些作为相关函数的测试。

然而,我喜欢规范,也许能将这种规范风格的信息放在一个fspec中,并从那里驱动相同的测试,这对我来说听起来很棒。

我对Clojure的使用 somewhat 新,试图做一些问题,可以用来更深入地学习,同时也能略微挑战一下我自己;所以我主要想知道这看起来是否有用,或者只是我自己的想法。
...