专门检查矩阵中的向量 Clojure 模式



在我的程序中,我使用了一种矩阵(作为向量的向量),如下所示:

[[:lt :lt :gt :eq]
 [:eq :lt :gt :eq]
 [:eq :eq :gt :gt]
 [:un :eq :lt :lt]]

我有一个模式,声明为:

(def OrderMatrix [[(s/enum :lt :eq :gt :un)]]

我想做的是进一步限制模式,以确保我的矩阵是clojure.lang.PersistentVector的向量,或者更好(如果可能的话),是一个支持随机访问的结构。在模式中使用[]似乎只测试序列,所以列表列表也会传递模式。

如何用模式来表达这种约束?

您可以使用schema/bothschema/pred的组合。这里有一个例子:

(defn Vector [inner-schema]
  (schema/both (schema/pred vector? "vector")
               [inner-schema]))
(defn RandomAccess [inner-schema]
  (schema/both
   (schema/pred
    (partial instance? java.util.RandomAccess)
    "random access")
   [inner-schema]))
(def OrderMatrix (Vector (Vector (schema/enum :lt :eq :gt :un))))
;; or (def OrderMatrix (RandomAccess (RandomAccess (schema/enum :lt :eq :gt :un))))

然后:

user> (schema/check OrderMatrix ['(:lt)])
[(not ("vector" (:lt)))]

最新更新