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

时间:2017-04-27 13:01:28

标签: clojure plumatic-schema

我想创建一个谓词函数,当某些东西与模式X匹配时返回true,否则返回false。

2 个答案:

答案 0 :(得分:3)

您可以使用schema/check,其工作方式与schema/validate类似,但会直接将错误作为值返回,而不是在未发现错误时抛出异常或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“编译一个有效的架构检查器”:

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

答案 1 :(得分:0)

也许不是最漂亮的解决方案,但我们可以使用模式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

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