Clojure规范和解构?

时间:2018-06-07 17:49:12

标签: clojure clojure.spec

不确定如何编写Spec以检查函数的析构参数。

如果我有这个简单的功能:

(defn make-name [[first last]]
  (str first " " last))

我为这个论点编写了这个规范:

(s/def ::vstring2 (s/coll-of string? :kind vector? :count 2 :distinct false))

它正常工作:

(s/conform ::vstring2 ["Rich" "Hickey"])
=> ["Rich" "Hickey"]

但是当我尝试将它应用于这样的函数时:

(s/fdef make-name
        :args ::vstring2
        :ret string?)

它爆炸了:

(stest/check `make-name)
=>
({:spec #object[clojure.spec.alpha$fspec_impl$reify__2451
                0x7dd4c5ac
                "clojure.spec.alpha$fspec_impl$reify__2451@7dd4c5ac"],
  :clojure.spec.test.check/ret {:result #error{:cause "Wrong number of args (2) passed to: roster/make-name",

(...)

如何使用::vstring2编写函数Spec?或者我呢?

谢谢。

1 个答案:

答案 0 :(得分:4)

您只需要为函数的参数指定另一个规范,例如使用s/cat

(s/fdef make-name
  :args (s/cat :arg1 ::vstring2)
  :ret string?)

在您的示例中,:args规范期望两个参数,因为您的::vstring2规范是一个期望两个字符串的集合。通过此更改,函数:args规范知道它只需要一个参数,该参数应符合::vstring2

还有更多功能规范示例herehere