代码之家  ›  专栏  ›  技术社区  ›  interstar

如何为接受序列参数的函数编写Clojure规范?

  •  2
  • interstar  · 技术社区  · 7 年前

    我正在写一个函数,它接受一系列三角形(实际上表示为 maps

    我的规格是:

    (s/fdef triangle-list-to-pattern
            :args (s/cat :trs (s/* ::maths/Triangle))
            )
    

    函数接受一个参数trs,它是一个三角形序列。

    fails spec: :patterning.maths/Triangle at: [:args :trs] predicate: map?
    

    如果我用spec显式测试传递给函数的参数,它就会通过。它实际上只是一系列符合三角形标准的事情。

    这个功能似乎正在发挥作用。这个论点似乎是正确的,单独测试时通过了规范。所以我想我得到了 fdef 不知怎的错了。

    有什么问题吗?

    注:三角形定义如下:

    (s/def ::Triangle (s/keys :req-un [::A ::B ::C ::a ::b ::c ::ax ::ay ::bx ::by ::cx ::cy]))
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Taylor Wood    7 年前

    你的原因 :args 规范不起作用,是吗 regex specs

    您可以通过包装内部regex规范来避免这种行为 s/* 在里面 s/spec :

    (s/cat :trs (s/spec (s/* ::maths/Triangle)))
    

    (s/cat :trs (s/coll-of ::maths/Triangle))
    

    您的示例规范 s/cat 是指用零个或多个元素来描述单个序列。

    (defn adder [& nums] (apply + nums))
    (s/fdef adder :args (s/cat :nums (s/* int?)))
    (st/instrument `adder)
    (adder 1 2 3)
    
    推荐文章