Clojure的一项伟大功能是它将集合视为函数,这意味着可以对其进行调用
。
({:a 1, :b 2} :a) => 1
(#{:a :b} :a) => :a
([:a :b :c] 1) => :b
然而,如果您能独立于它们的特定类型查询这些函数的定义域和值域,那就更好了。
当前的keys
和vals
函数已经实现了这一点,但仅适用于Map。我认为通过接受集合和向量(如以下示例中所示)使这些函数更通用是个好主意。
(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}
的快捷方式。