Clojure - 保留记录类型的注册表

non*_*com 2 record clojure

我试图在记录构造函数之间实现数据调度.调度由名称(这是一个字符串,与数据一起接收)完成.我希望每个新的记录类型能够自动注册发送.例如,在Scala中,我会做出类似的东西:

object Dispatcher {
  val dispatchMap = scala.collection.mutable.Map[String, Creator]()
  def += (crt: Creator) { dispatcherMap += (crt.name, crt) }
}

abstract class Creator[C <: Creation](val name: String) {
  Dispatcher += this

  def apply(consData: ConstructionData): C

}
Run Code Online (Sandbox Code Playgroud)

这样每次Creator创建一个类型的对象时,它就会被注册Dispatcher,之后可以通过它的名字找到并传递ConstructionData给创建一个Creation.

Clojure中的等价物是什么?

Ank*_*kur 5

我会使用map和plain old functions方法,如下所示:

(ns creator)

(def dispatcher (atom {}))

(defn defcreator [name apply-fn]
  (swap! dispatcher assoc name apply-fn)
  apply-fn)

(defcreator :abc-creator (fn [cons-data] (do-something cons-data) ))
Run Code Online (Sandbox Code Playgroud)