2

レコードコンストラクター間でのデータディスパッチを実現しようとしています。ディスパッチは名前(データとともに受信される文字列)によって行われます。そして、新しいレコードタイプごとに自動的にディスパッチに登録してほしい。たとえば、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

}

タイプのオブジェクトが作成されるたびに、そのオブジェクトCreatorはに登録され、Dispatcher後でその名前で検索され、を渡しConstructionDataて作成できるようになりますCreation

Clojureで同等のものは何でしょうか?

4

1 に答える 1

5

以下に示すように、マップと単純な古い関数のアプローチを使用します。

(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) ))
于 2013-02-25T14:09:26.347 に答える