我们怎样才能动态创建类型或记录的“实例”

时间:2010-09-20 07:10:09

标签: constructor clojure types dispatch

这个问题与this one密切相关,但我认为更为笼统。

最近,我尝试使用multimethods(或者如果可能的话,使用唯一的函数构造函数)动态创建类型“实例”,基于元数据标记。我将一个类型(引擎盖下的java类)与此标记链接,然后我不知道如何以优雅的方式继续(没有eval或java反射和字符串); new是一种特殊的形式,虽然你使用宏,但它很难处理。

在seudo-code中,它将是:

(def my-tagged-data (with-meta my-data {:my-type-tag my-ns.My-Type}))
(def factory-function [tagged-data] 
     (create (:my-type-tag (meta tagged-data)) tagged-data))

2 个答案:

答案 0 :(得分:2)

您可以为您的类型提供工厂功能。

(def my-tagged-data (with-meta my-data {:my-type-factory `my-type-factory}))

(defn factory-function
  [tagged-data] 
  (@(resolve (:my-type-factory (meta tagged-data))) tagged-data))

这可能是也可能不可行。

答案 1 :(得分:0)

我认为你必须使用反射。 (我认为,比eval更好的想法)。