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

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

+1
规格
由于解构化规格是通过 `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? 选项并使用它来处理解构规范,为这个问题提供了一个提议的解决方案。如果 s/keys:closed? 设置为 true 一起使用,则 conform 将仅验证声明的规范,而不是 s/keys 的默认行为是验证具有现有规范的命名空间中的所有关键字。

在此补丁之后,上述示例运行正常,并且没有设置 :closed? 为 true 的 s/keys 的使用将根据当前行为验证 ::keys

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

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