0

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

4

2 回答 2

3

您可以使用schema/checkwhich 的工作方式类似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))))
于 2017-04-27T13:56:20.337 回答
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

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

于 2017-04-27T13:01:28.450 回答