由于解构规范是通过 `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)
这感觉像是实现细节泄露。