【发布时间】:2017-07-04 20:18:36
【问题描述】:
我还没有找到任何关于如何执行递归实体规范的示例,就像我在下面尝试的那样。我意识到 ::left 和 ::right 失败是因为它们尚未定义,所以我想知道如何在 ::node 规范中递归地定义它们。
(s/def ::key string?)
(s/def ::value string?)
(s/def ::left ::node)
(s/def ::right ::node)
(s/def ::n int?)
(s/def ::node (s/keys :req [::key ::value ::n]
:opt [::left ::right]))
(defn test-it []
(s/valid? ::node
{::key "hi"
::value "bye"
::n 0
::left {::key "what"
::value "nothing"
::n 0}
::right {::key "hello"
::value "goodbye"
::n 0}
}))
【问题讨论】:
-
在我看来它在抱怨
::node没有在::left和::right的定义中定义,因此您可能想尝试在这两个定义之前定义::node。 -
@Sam Estep:那么你也会遇到同样的问题,因为
::node是根据::left和::right定义的,这两个变量还没有定义。需要一个断路器,例如 Clojure 中的declare。 -
@ChrisMurphy 不,它适用于在
::node之后定义的::left和::right。请参阅我对粘贴的 REPL 会话的回答。
标签: recursion clojure clojure.spec