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

欢迎!请参见关于页面以了解更多关于如何使用本站的信息。

+1
Spec
命名空间中的 :keys 解构(见 CLJ-1919)支持 `::foo/keys` 或 `::foo/syms` 中的任何类型的标识符,但核心规范只允许 `simple-symbol?`。

示例


用户=> (let [{::keys [:foo]} {::foo 1}] foo)
使用clojure.core/let宏展开时发生语法错误(REPL:1:1)。
...一系列的规范问题


预期


用户=> (let [{::keys [:foo]} {::foo 1}] foo)
1


*提议*: 将此情况的规范从 `simple-symbol?` 扩展到 `ident?`(代码支持)。
*补丁*: clj-2473.patch

3 个答案

0
_评论员:thheller_

{{ident?}}接受命名空间关键字(和符号),考虑到当前实现将忽略命名空间并使用“keys”使用的命名空间,可能不应该允许。为了避免混淆,我认为规范应该限制于 {{simple-keyword?}} 或 {{simple-symbol?}} 在命名空间“keys”的情况下,并只为非命名空间 {{:keys}} 接受 {{ident?}}。


(let [{:foo/keys [:other/bar]} {}])
(let [{:foo/keys [other/bar]} {}])
0

评论者:alexmiller

我考虑了这一点,并决定匹配代码。这同样也与 :keys 保持一致性。

0
参考: https://clojure.atlassian.net/browse/CLJ-2473 (alexmiller 报告)
...