2024 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面,了解更多关于如何使用本网站的信息。

0
规范
拥有描述规范形式的规格将很有用,这样就可以从像(s/keys :req [::a ::b] :opt [::c])这样的规范形式到允许您在不解析s表达式的情况下获取各个部分的符合版本。这可以通过创建规格来实现,从而允许


user=> (require '[clojure.spec :as s] '[clojure.spec.specs])
user=> (s/def ::aspec (s/keys :req [::a ::b] :opt [::c]))
user=> (def aspec-data (s/conform :clojure.spec.specs/spec (s/form ::aspec)))
user=> (pr aspec-data)
[:form {:s clojure.spec/keys,
        :args {:req [[:key :clojure.spec.specs/a] [:key :clojure.spec.specs/b]],
               :opt [:clojure.spec.specs/c]}}]
user=> (map val (-> aspec-data val :args :req))
(:clojure.spec.specs/a :clojure.spec.specs/b)


*补丁:* spec-forms.patch (一个正在进行中的工作)

9 个回答

0

评论者:saulshanabrook

我能帮忙吗?我很乐意工作。对我来说,尝试从fspec的:args和:ret解析规范会有所帮助。

0

评论者:alexmiller

如您所见,这里已经有一个补丁,其中包含大量的工作(以及Rich和Stu的一些早期审查)。目前在这方面最有用的帮助是对其中存在的差距/未解决的问题的反馈。

0

评论者:alexmiller

另外,我也不会期望它在这里就确定并包含进来,除非我们首先将规格表单定稿,因为这些表单仍然可能发生变化。

0

评论由:akiel

在当前补丁中,除了在 s/keys 的键外,缺少对规格的引用。如何正确建模关键词呢?一种方法是将 qualified-keyword? 添加为第四个选项到 ::spec 的或规格中。那么 ::spec 就可以用作在 s/valid?s/conforms/form 等中的规格参数。

0

评论者:alexmiller

是的,这可能会很好。

0
_评论由:akiel_

另一个观察:目前允许 {{s/and}}{{s/or}} 不包含谓词。


(defspec clojure.spec.alpha/and (s/* ::spec))
(defspec clojure.spec.alpha/or (s/* (s/cat :tag keyword? :pred ::spec)))


应该有一个清晰语义定义,说明空形式的含义,或者我们应该在这里使用 {{s/+}} 并要求至少有一个谓词。对于 and 形式,我们可以定义 (s/and)(s/and any?) 相同,也与 any? 相同。对于 or 形式,由于 (s/conform) 返回带有标签的结果。因此使用 (s/or) 对任何值进行匹配将导致 ::s/invalid,这使得空的 or 形式无效。
0

评论者:alexmiller

对这些内容有明确的语义定义——它们与 clojure.core/and 和 clojure.core/or 相同。在我看来,这些都是正确的。

0

评论由:akiel

谢谢。我明白了。在 {{clojure.core}} 中的文档定义,(clojure.core/and) 返回 true(clojure.core/or) 返回 nil

0
by
参考: https://clojure.atlassian.net/browse/CLJ-2112(由alexmiller报告)
...