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

欢迎!请在 关于 页面了解有关该操作的更多信息。

0
规范
拥有描述 spec 表单的 spec 会很有用,这样就可以从一个 spec 表单如 (s/keys :req [::a ::b] :opt [::c]) 转换为符合规范版本,允许您在不解析 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 很有帮助。

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}} 不包含任何谓词(preds)。


(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/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 提出)
...