2010-09-20 21 views
1

此問題與this one密切相關,但我認爲更一般。我們如何能夠即時創建某個類型或記錄的「實例」

最近我嘗試使用multimethods(或使用獨特的函數構造函數,如果可能)創建類型「實例」,基於元數據標記。我用這個標籤鏈接了一個類型(引擎蓋下的java類),然後我不知道如何以優雅的方式繼續(沒有eval或java反射和字符串);新是一種特殊的形式,雖然使用宏,但很難處理。

在seudo代碼將是:

(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

重新閱讀引用的上一個問題的評論可能唯一的方法是修改clojure的數據類型功能: -/ – jneira 2010-09-20 08:24:23

+0

是否要爲每種記錄類型編寫自定義工廠代碼並以某種方式將其與記錄類型相關聯,以便您可以使用記錄類型的名稱(而不是工廠名稱)調用工廠? – Chouser 2010-09-20 14:38:59

+0

mmm這正是mi原來的想法,如果可能,沒有明確的工廠,使用多方法或協議方法(或有點派遣)以可擴展的方式添加構造函數 – jneira 2010-09-20 16:20:27

回答

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

這可能也可能不可行。

+0

是@解決我的未知錯字或黑客?我沒有注意解決,感謝這一點。 – jneira 2010-09-20 12:39:56

+0

@是dereffing由解析返回的var,但在這種情況下是可選的,因爲您可以直接調用var。 – cgrand 2010-09-20 13:22:56

+0

kotarak的想法很好,但沒有象徵符號,您可以直接將工廠放入元數據中,並使用全局註冊表作爲遺留類的後備。 – cgrand 2010-09-20 13:27:01

0

我認爲你必須使用反射。 (我認爲比eval更好的想法)。

+0

此外,我缺少一些明顯的原因,我不知道如何使用newInstance ,導致整數/類別都不工作(整數/ newInstance) – jneira 2010-09-20 11:44:46

相關問題