Clojure 的一个伟大特性是它将集合视为函数,这意味着我们可以调用它们
({:a 1, :b 2} :a) => 1
(#{:a :b} :a) => :a
([:a :b :c] 1) => :b
但是,如果我们能够独立于其特定类型查询这些函数的 定义域 和 值域,那就更好了。
当前的 keys
和 vals
函数已实现这一功能,但仅限于 Maps。我认为将这些函数做成更通用的形式,接受集合和向量,是个不错的主意,如下例所示
(keys #{:a :b}) => (:a :b)
(vals #{:a :b}) => (:a :b)
(keys [:a :b :c]) => (0 1 2)
(vals [:a :b :c]) => (:a :b :c)
我考虑到的特定用例中,这个功能可能会很有用。比如,在关系数据建模的数据导向 DSL 中定义外键映射的更简洁语法,其中 #{:attr1 :attr2}
可以用作 {:attr1 :attr1, :attr2 :attr2}
的快捷方式。