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 中的键。如何正确地建模关键字?一种方法是在 ::spec 的或规格中添加 qualified-keyword? 作为第四个选项。这样,::spec 就可以用作 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 提出)
...