2011-06-19 60 views
6

我想在我的Clojure deftype中實現transientpersistent!。據我所知,這意味着有另一種deftype,TransientMyThing,實現必要的方法。好了,但是這兩個類需要彼此瞭解才能返回對方的實例。在Clojure中相互引用deftypes

我想我可以通過前向聲明Clojure函數make-transient和make-persistent,然後定義deftype(通過引用該函數),然後使用現有類型實現函數,但似乎對我很重要。有更好的選擇嗎?

編輯:這工作,但它仍然是毛病。

+0

現在無法對其進行測試,但它可能在您使用「擴展類型」定義兩種類型後添加功能? – mikera

+4

目前,除了輔助函數的前向聲明,沒有其他選擇。我認爲這不會導致明顯的性能損失(尤其是1.3)。然而,還有一件事可能會起作用:在asTransient方法中用reify定義瞬態類型 - 我沒有測試,但很有可能會遇到另一個編譯器限制(如果堆棧跟蹤說到一個存根,那就是那個) 。 – cgrand

+0

cgrand的評論很完美。如果這是一個答案,我會接受它;只需在此添加評論,以便在問題中發生的任何人知道如何解決問題。 – amalloy

回答

4

在Clojure 1.3及更高版本中,稍微簡單一些的解決方案是依賴Clojure爲您的deftypes創建的構造函數 - > transient和 - > persistent !.既然這些都是函數,而不是宏,你可以轉發聲明它們。然後你可以使用它們,而不是你自己的make-transient和make-persistent,你不必自己實現它們。