1

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

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

在伪代码中它将是:

(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))
4

2 回答 2

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))

这可能可行,也可能不可行。

于 2010-09-20T11:29:17.717 回答
0

我认为你必须使用反射。(我认为比 eval 更好的主意)。

于 2010-09-20T09:49:23.133 回答