gpt4 book ai didi

clojure.spec : `alt` vs `or` for sequence spec

转载 作者:行者123 更新时间:2023-12-02 09:33:50 26 4
gpt4 key购买 nike

我正在遵循 clojure.spec 的指南 ( http://clojure.org/guides/spec )。我对序列规范的 altor 之间的差异感到困惑。

对我来说,以下两个示例同样有效。那么两者有什么区别呢?

; Use `alt`
(s/def ::config (s/* (s/cat :prop string?
:val (s/alt :s string? :b boolean?))))
(s/explain ::config ["-server" "foo" "-verbose" true "-user" 13])

; Use `or`
(s/def ::config (s/* (s/cat :prop string?
:val (s/or :s string? :b boolean?))))
(s/explain ::config ["-server" "foo" "-verbose" true "-user" 13])

最佳答案

s/alt 用于连接嵌套正则表达式规范,其中使用 s/or 指定嵌套序列。在您的示例中,它没有什么区别,因为您没有使用嵌套的正则表达式规范。这是一个例子:

(s/def ::number-regex (s/* number?))

(s/def ::or-example (s/cat :nums (s/or :numbers ::number-regex)))

(s/valid? ::or-example [1 2 3])
;;-> false
(s/valid? ::or-example [[1 2 3]])
;;-> true

如您所见,or 指定一个嵌套序列,在该序列中启动新的正则表达式上下文,而 alt 指定相反的情况:

(s/def ::alt-example (s/cat :nums (s/alt :numbers ::number-regex)))

(s/valid? ::alt-example [1 2 3])
;;-> true
(s/valid? ::alt-example [[1 2 3]])
;;-> false

关于clojure.spec : `alt` vs `or` for sequence spec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com