Clojure的一个显著特性是它将集合视为函数,这意味着可以将其调用
({:a 1, :b 2} :a) => 1
(#{:a :b} :a) => :a
([:a :b :c] 1) => :b
然而,最好能够独立于函数的具体类型查询这些函数的**定义域**和**值域**。
当前的keys
和vals
函数实现了这一点,但仅限于映射。我认为将这些函数做得更通用,接受集合和向量等,是一个好主意,如下面的示例所示
(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}
的快捷方式使用。