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(函式的符合返回值)。