Clojure - 用固定值 - >键功能映射或设置?

Kur*_*out 5 clojure clojureclr

我的程序中有很多记录,我最终使用其中一个字段作为键放入地图.例如

(defrecord Foo. [id afield anotherfield])
Run Code Online (Sandbox Code Playgroud)

然后我将其添加到id为关键的地图中.这一切都非常可行,但有点单调乏味,例如在向地图添加新的Foo实例时,我需要先提取密钥.我想知道clojure.core中的某个地方是否存在已经存在的数据结构?

基本上我想通过在集合的构造时给组映射函数(即:id)设置一个值来构造一组Foo,然后在我想添加/查找/删除/时使用它. . 一个值.

所以代替:

(assoc my-map (:id a-foo) a-foo))
Run Code Online (Sandbox Code Playgroud)

我能做到,说:

(conj my-set a-foo)
Run Code Online (Sandbox Code Playgroud)

更有趣的是,合并和合并 - 支持.

mik*_*era 3

听起来像是一个简单的情况,您希望使用一个函数来消除“乏味”的部分。

例如

(defn my-assoc [some-map some-record]
  (assoc some-map (:id some-record) some-record))
Run Code Online (Sandbox Code Playgroud)

如果您经常这样做并且需要不同的关键函数,您可能想尝试更高阶的函数:

(defn my-assoc-builder [id-function]
  (fn [some-map some-record] 
    (assoc some-map (id-function some-record) some-record)))

(def my-assoc-by-id (my-assoc-builder :id))
Run Code Online (Sandbox Code Playgroud)

最后,请注意,您可以使用宏执行相同的操作。然而,关于宏的一个有用的一般规则是,除非确实需要它们,否则不要使用它们。因此,在这种情况下,由于可以使用函数轻松完成,因此我建议坚持使用函数。