gpt4 book ai didi

clojure - 键*/具有内联值规范的键

转载 作者:行者123 更新时间:2023-12-02 11:07:57 30 4
gpt4 key购买 nike

我想编写一个带有 keys/keys* 的规范,但能够内联值规范,但不支持 by design ,我明白了其背后的原因。然而,有时,本地图存在特定上下文时,您确实希望(或者只是通过遗留或第三方)键和值之间的耦合。

我对规范还是新手,这只是我第一次将它与现有项目集成,它不断给我带来问题,因为它假设太多,特别是由于上述原因。例如。想象一个描述时间段的映射,并有一个用于日期的 until 键,在同一个 ns 中,有一个用于列表处理的映射,并且有一个采用谓词的 until功能。我现在需要手动为甚至不存在的命名空间编写完全命名空间的键(别名很可爱,但必须在多个命名空间/文件中不断复制)。除了令人恼火之外,我觉得它还容易出错。

另一个 keys/keys* 假设太多的地方是,如果我什至想要关键字作为我的键。我现在正在为非程序员但技术用户编写 DSL,底线是我想指定一个以符号作为键的映射。这似乎不受任何支持。

有什么我没有得到的吗?或者规范真的缺少基本功能吗?

最佳答案

您可以使用 map-of 指定以符号作为键的映射:

(s/def ::sm (s/map-of symbol? any?))

或者通过将 map 指定为条目集合:

(s/def ::sm (s/every (s/tuple symbol? any?) :kind map? :into {}))

后者特别有趣,因为您可以使用许多不同类型的元组来描述更有趣的 map ,而不是单个元组。您甚至可以通过以下方式将这些符号连接到其他现有规范:

(s/def ::attr1 int?)
(s/def ::attr2 boolean?)
(s/def ::sm (s/every (s/or :foo (s/tuple #{'foo} ::attr1)
:bar (s/tuple #{'bar} ::attr2))
:kind map? :into {}))
(s/valid? ::sm {'foo 10 'bar true}) ;; => true

关于clojure - 键*/具有内联值规范的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41239540/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com