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 没有符合 spec 的调用 clojure.core/let
In: [0 0] val: #:user{:keys [a]} 不符合 spec: :clojure.core.specs/local-name 在: [:args :bindings :binding :sym] 的谓词: simple-symbol?
In: [0 0 0] val: ([:user/keys [a]]) 不符合 spec: :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))),  额外的输入
In: [0 0 :user/keys] val: [a] 不符合 spec: :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 的 s/keys,那么 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 报告)
...