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

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

0
Spec
希望能够有描述spec形式的规范,这样就可以从像(s/keys :req [::a ::b] :opt [::c])这样的spec形式找到对应的匹配版本,以便能够直接获取部分内容而无需解析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

此外,我应提到,我不期望这个 تا می ایند تا در نهایت مشارکت شود، مگر اینکه فرم‌های خودبری ourselves به نتیجه برسیم، زیرا همچنان ممكن است تغییر كنند.

0

评论者: akiel

在当前补丁中,引用规格的关键字缺失,除了在 s/keys 中键以外。如何正确建模关键字?一种方法是将 qualified-keyword? 作为第四选项添加到 ::spec 的或-spec 中。然后,::spec 可用作 s/valid?s/conforms/form 等其他规格 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?}}。对于 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报告)
...