【发布时间】:2019-12-12 07:28:19
【问题描述】:
我正在尝试 Clojure spec 并从函数 :pre 约束中调用它。
我的规范::mustbe-seql-of-vec-of-2-int 将检查传递给函数的参数是否是从 0 到 4 个正好为 2 个整数的向量的序列:
(require '[clojure.spec.alpha :as s])
(s/def ::mustbe-seql-of-vec-of-2-int
(s/and
::justprint
(s/coll-of
::mustbe-vec-of-2-int
:kind sequential?
:min-count 0
:max-count 4)))
所以规范是由其他规范组成的,特别是::justprint,除了打印传递的调试参数和测试集合参数的coll-of之外什么都不做。
coll-of 的文档说:
用法:(coll-of pred & opts)
返回满足 pred 的项目集合的规范。不像 'every', coll-of 将彻底符合每个值。
但是,作为第一个参数,我没有使用 pred(一个接受参数检查并返回真实值的函数),而是另一个规范(一个接受参数检查并返回的函数,我不确定什么),在这种情况下,在::mustbe-vec-of-2-int 下注册的规范。
这很好用。
这是正确的样式并且可以正常工作吗?
附言
(s/def ::justprint
#(do
; "vec" to realize the LazySeq, which is not realized by join
(print (d/join [ "::justprint ▶ " (vec %) "\n"] ))
true))
(s/def ::mustbe-vec-of-2-int
(s/coll-of integer? :kind vector? :count 2))
【问题讨论】:
标签: clojure clojure.spec