2024 年 Clojure 调查表 中分享您的想法!

欢迎!请参阅 关于 页面了解有关此如何工作的更多信息。

0
Spec

在指定我正在开发的库时,我遇到了 s/unforms/? 结合时的一个奇怪行为

(require '[clojure.core.specs.alpha :as cs])

(def binding-form '[a b :as c])

(def x (s/conform ::cs/seq-binding-form binding-form))
;; x => {:forms [[:local-symbol a] [:local-symbol b]], :as-form {:as :as, :as-sym c}}

(s/unform ::cs/seq-binding-form x) 
;; => (a b (:as c))

(s/valid? ::cs/seq-binding-form (s/unform ::cs/seq-binding-form x))
;; => false

这是预期行为吗?根据直觉,我本以为第一个 unform 会产生原来的形式,并且 unform 的结果应该会通过(使用相同的 spec)验证。

1 答案

0

选择
 
最佳答案

这里可能有一些事情。正则表达式表单解析顺序集合(重要的是列表和向量),但没有方法保留原始集合类型并将其反转换为正确的类型。这是一个通用问题,对这个问题的解决方案并不容易(如果你考虑了 conform,unform 和 gen 的所有方面)。我们 currently 没有计划在 spec 1 中解决这个问题。在 spec 2 中,我们现在有支持此功能的 s/catv 和 s/cats,它们是特定类型的变体。

至于 (:as c),我认为这是一个已知与 ? conforming 后缀的 bug,但我会花一些时间找到链接。

是的,有一个错误报告:[https://ask.clojure.org/index.php/2418/nesting-cat-inside-causes-unform-to-return-nested-result?show=2418#q2418](https://ask.clojure.org/index.php/2418/nesting-cat-inside-causes-unform-to-return-nested-result?show=2418#q2418)

我没注意到这个。这回答了我的问题。

至于 catv 和 catc,了解它们是好的。我已经能够看出它们在宏/dsl场景中的用途。
...