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}
。