Clojure规范访问分层规范中的数据

Clojure规范访问分层规范中的数据,clojure,clojure.spec,Clojure,Clojure.spec,如果您有一组用于验证分层数据集的规范,比如yaml文件。从一个子规范中,是否可以引用树中较早出现的数据?这是您可以采取的一种方法的示例: (s/def ::tag string?) (s/def ::inner (s/keys :req-un [::tag])) (s/def ::outer (s/and (s/keys :req-un [::inner ::tag]) #(= (:tag %) ;; this tag must equal inner tag

如果您有一组用于验证分层数据集的规范,比如yaml文件。从一个子规范中,是否可以引用树中较早出现的数据?

这是您可以采取的一种方法的示例:

(s/def ::tag string?)

(s/def ::inner (s/keys :req-un [::tag]))

(s/def ::outer
  (s/and
    (s/keys :req-un [::inner ::tag])
    #(= (:tag %) ;; this tag must equal inner tag
        (:tag (:inner %)))))

(s/conform ::outer {:tag "y" ;; inner doesn't match outer
                    :inner {:tag "x"}})
;=> :clojure.spec.alpha/invalid

(s/conform ::outer {:tag "x"
                    :inner {:tag "x"}})
;=> {:tag "x", :inner {:tag "x"}}

根据您的需求,您可以从外向内而不是由内而外做出这样的断言。

这是您可以采取的一种方法的示例:

(s/def ::tag string?)

(s/def ::inner (s/keys :req-un [::tag]))

(s/def ::outer
  (s/and
    (s/keys :req-un [::inner ::tag])
    #(= (:tag %) ;; this tag must equal inner tag
        (:tag (:inner %)))))

(s/conform ::outer {:tag "y" ;; inner doesn't match outer
                    :inner {:tag "x"}})
;=> :clojure.spec.alpha/invalid

(s/conform ::outer {:tag "x"
                    :inner {:tag "x"}})
;=> {:tag "x", :inner {:tag "x"}}

根据您的需求,您可以从外向内而不是由内而外做出这样的断言。

您有具体的例子吗?一般来说,您的内部/嵌套规范不会接收祖先数据,但是您可以解决外部规范的问题。我想验证一些代表复杂数据结构的yaml。我想证明的验证点是,结构的一部分引用同一结构的另一部分,但我想证明引用的部分实际上存在。这意味着要在引用点应用谓词,并回溯yaml树,然后回溯到引用项的点。为此,我需要能够获得验证引用的规范的父级。看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、回溯等)。你提供的细节越多,你可能得到的答案就越多。检查和。你有具体的例子吗?一般来说,您的内部/嵌套规范不会接收祖先数据,但是您可以解决外部规范的问题。我想验证一些代表复杂数据结构的yaml。我想证明的验证点是,结构的一部分引用同一结构的另一部分,但我想证明引用的部分实际上存在。这意味着要在引用点应用谓词,并回溯yaml树,然后回溯到引用项的点。为此,我需要能够获得验证引用的规范的父级。看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、回溯等)。你提供的细节越多,你可能得到的答案就越多。检查和。谢谢一个非常有用的答案谢谢一个非常有用的答案