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 的 or-spec。然后,可以在 s/valid?s/conforms/form 等处的规格参数中使用 ::spec

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?}} 相同。对于 or-form,由于 {{s/conform}} 返回标记的结果。因此,使用 {{(s/or)}} 对任何值进行校验将导致 {{::s/invalid}},这使得空的 or-form 没有用。
0

评论由:alexmiller发表

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

0

评论者:akiel

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

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