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

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

0
Spec
对于描述spec表单的spec会很有用,这样可以从像(s/keys :req [::a ::b] :opt [::c])这样的spec表单跳转到不需要解析s表达式即可获取部分的符合版本。这可以通过创建spec来实现,从而允许


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中解析spec非常有帮助。

0

由alexmiller做出的评论

如您所见,这里有一个已经进行了大量工作的现有补丁(富和斯图的一些早期评论)。目前在这方面最有用的帮助是对其中空白/开放问题的反馈。

0

由alexmiller做出的评论

此外,我应该指出,我不期望在规格表单本身最终确定并包含之前,这项工作就能最终完成。

0

评论者:akiel

在当前补丁中,除了 s/keys 中的键之外,缺少引用规格的关键词。那么怎样才是构建关键词的正确方法?一种方法是将 qualified-keyword? 作为第四个选项添加到 ::spec 的 or-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
参考:https://clojure.atlassian.net/browse/CLJ-2112 (由alexmiller报告)
...