fdef 为函数编写规范

假设我们有以下功能:

(defn nat-num-count [nums] (count (remove neg? nums)))

我们可以通过定义相同名称的函数规范来编写此函数的规范:

(clojure.spec/fdef nat-num-count
        :args (s/cat :nums (s/coll-of number?))
        :ret integer?
        :fn #(<= (:ret %) (-> % :args :nums count)))

:args 采用正则表达式规范,该规范通过对应于参数名称和相应规范的关键字标签来描述参数序列。:args 所需的规范是正则表达式规范的原因是为函数支持多个 arities。:ret 指定函数返回值的规范。

:fn 是一个限制:args:ret 之间关系的规范。它在 test.check 中运行时用作属性。它用一个参数调用:一个带有两个键的映射::args(函数的符合参数)和:ret(函数的符合返回值)。