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

欢迎!请查看 关于 页面获取更多此页如何工作的信息。

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

示例


user=> (let [{::keys [:foo]} {::foo 1}] foo)
在 REPL:1:1 处宏展开 clojure.core/let 时出现语法错误。
...许多规范问题


预期


user=> (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报告)
...