2024 Clojure状态调查中分享您的想法!

欢迎!请查阅关于页面,了解更多关于这个平台的信息。

0
Spec

向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 and :idem above could obvs be done with :fn, but seems handy to put together once one gets :comm and :assoc in place.

这可能引出对如何同样处理相关函数集的约束或不变性的问题,尽管这可能不太有用。然而,这实际上可能更合适的是将其作为fspec之外的单独规范来做 - ?

1 答案

0

您试图解决什么问题?

by
说实话,没有真正的解决问题——我是一个基于属性/生成测试的爱好者,所以我已经有了这些作为有争议函数的测试。

然而我喜欢规范,对于我来说,在fspec中可能能够获得这种规范风格的信息似乎很好,从而可以从那里驱动相同的测试。

我对Clojure使用有些新,正试图挑战自己,去选择一些可以用来深入学习并挑战我的问题;所以我主要是在考虑这看起来是否有用,或者这只是我自己的想法。
...