可以从 Plumatic Sc​​hema 创建谓词函数吗?

Can one make a predicate function from a Plumatic Schema?

我想做一个谓词函数,当某些东西匹配模式 X returns 为真,否则为假。

也许不是最漂亮的解决方案,但我们可以使用模式 validate 并捕获它在失败时抛出的异常。

(schema/defschema string-vector
  [schema/Str])

(defn str-vec? [arg]
  (try (schema/validate string-vector arg)
       true
       (catch clojure.lang.ExceptionInfo e
         false)))

(str-vec? ["hi"])   ; => true
(str-vec? ["hi" 5]) ; => false

希望其他人可以提供更好的解决方案。

可以直接使用schema/check which works like schema/validate但returns错误作为值,而不是抛出异常或nil没有发现错误时:

(schema/defschema string-vector
  [schema/Str])

(defn str-vec? [arg]
  (nil? (schema/check string-vector arg)))

(str-vec? ["hi"])   ; => true
(str-vec? ["hi" 5]) ; => false

还有schema/checker其中"compiles an efficient checker for schema":

(let [str-vec?-checker (schema/checker string-vector)]
  (defn str-vec? [arg]
    (nil? (str-vec?-checker arg))))