这个问题与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))
答案 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更好的想法)。