【问题标题】:Clojure spec: Using a "spec" instead of a "pred" in "coll-of" actually works. Is this ok?Clojure 规范:在“coll-of”中使用“spec”而不是“pred”实际上是有效的。这个可以吗?
【发布时间】: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


    【解决方案1】:

    这是正确的样式并且可以正常工作吗?

    是的。规范、可以解析为规范的关键字和普通谓词函数可以在 clojure.spec API 的许多部分中互换使用。该文档字符串上下文中的“Pred”具有比一般 Clojure 谓词函数更广泛的含义,例如nil?.

    (require '[clojure.spec.alpha :as s])
    
    (s/conform int? 1) ;; => 1
    (s/conform int? false) ;; => :clojure.spec.alpha/invalid
    

    s/def 修改 clojure.spec 注册表,将关键字与规范值相关联。当您将 ::some-spec-keyword 传递给 clojure.spec API 时,它会从注册表中自行解析规范值。您还可以“别名”规范,例如(s/def ::foo ::bar).

    (s/def ::even-int? (s/and int? even?))
    (s/conform ::even-int? 2) ;; => 2
    (s/conform ::even-int? 3) ;; => :clojure.spec.alpha/invalid
    

    所以这些都是等价的:

    (s/conform (s/coll-of (s/and int? even?)) [2 4 6 8])
    (s/conform (s/coll-of ::even-int?) [2 4 6 8])
    (s/def ::coll-of-even-ints? (s/coll-of ::even-int?))
    (s/conform ::coll-of-even-ints? [2 4 6 8])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-18
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多