我還沒有找到任何如何執行遞歸實體規範的示例,如我在下面嘗試。我意識到::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會話。 –