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

欢迎!请参阅关于页面以获取有关这样做的更多信息。

+1
Spec
由于解构规范是以`s/keys`为依据实现的,因此在目前阶段,定义`::keys`或`::strs`规范可能会存在问题,因为它将与尝试使用`::keys`进行解构发生冲突

user=> (require '[clojure.spec :as s])
nil
user=> (s/def ::keys nil?)
:user/keys
user=> (let [{::keys [a]} {::a 1}] a)
ExceptionInfo 调用clojure.core/let时未符合规范
在: [0 0] val: #:user{:keys [a]} 不符合规范: :clojure.core.specs/local-name 在: [:args :bindings :binding :sym] 判断: simple-symbol?
在: [0 0 0] val: ([:user/keys [a]]) 不符合规范: :clojure.core.specs/seq-binding-form 在: [:args :bindings :binding :seq] 判断: (cat :elems (* :clojure.core.specs/binding-form) :rest (? (cat :amp #{(quote &)} :form :clojure.core.specs/binding-form)) :as (? (cat :as #{:as} :sym :clojure.core.specs/local-name))),  额外输入
在: [0 0 :user/keys] val: [a] 不符合规范: :user/keys 在: [:args :bindings :binding :map :user/keys] 判断: nil?
:clojure.spec/args  ([#:user{:keys [a]} #:user{:a 1}] a)
  clojure.core/ex-info (core.clj:4725)


这感觉像是实现细节泄漏。

4 答案

0

评论者:bbloom

我也遇到了这个问题。只是想说说,我希望看到这个修复,但我对提出的解决方案不是非常确定。至少,名字“closed?”似乎暗示了一个不可扩展的映射,但实际上这个标记更多或更少地意味着“不是一个参与全局键系统的映射”,我没有更好的名字建议。

0

由 alexmiller 发布的评论

提出的补丁不可行。我对如何解决这个问题有一些想法,但还没着手去做。

0

由 alexmiller 发布的评论

由于我们将不采取此方向,已从工单中删除提案和补丁。此处留存以供参考

"附加的补丁通过向 s/keys 添加 :closed? 选项以及使用它来处理解构规范,实现了一个针对此问题的建议解决方案。如果将 :closed? 设置为 true,则 conform 将仅验证声明的规范,而不是 s/keys 的默认行为,即验证所有具有现有规范的命名空间中关键词。

在此补丁之后,上面的示例运行良好,并且在没有将 :closed? 设置为 true 的情况下使用 s/keys 的用法将按照当前行为验证对 ::keys 的引用。

补丁: close-destructuring-keys-specs.diff"

0
参考:https://clojure.atlassian.net/browse/CLJ-2074(由 bronsa 报告)
...