请在 2024 年 Clojure 状态调查 中分享您的想法!

欢迎!有关如何使用本网站,请参阅 关于 页面获取更多信息。

0 投票
Spec
拥有描述规格形式的规格将非常有用,这样就可以从类似于 (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/conform 和其他地方作为规格 arg 使用。

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-form,我们可以定义 {{(s/and)}} 与 {{(s/and any?)}} 相同,也与 {{any?}} 相同。对于或形式,由于 {{s/conform}} 返回带标签的结果,所以使用 {{(s/or)}} 进行任何值的符合将导致返回 {{::s/invalid}},这使得空或形式变得无用。
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 报告)
...