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/valid?s/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-form,我们可以定义{{(s/and)}}与{{(s/and any?)}}相同,也和{{any?}}相同。对于or-form则比较困难,因为{{s/conform}}返回标记的结果。所以用任何值对{{(s/or)}}进行conform操作将导致{{::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](https://clojure.atlassian.net/browse/CLJ-2112)(由alexmiller报告)
...