2011-06-19 12 views
6

Clojureのdeftypeにtransientpersistent!を実装したいと思います。私が知る限り、これは、別の固有名詞、TransientMyThingを持って、必要なメソッドを実装することを意味します。さて、これまでのところ、2つのクラスは、お互いのインスタンスを返すためにお互いを知る必要があります。Clojureの相互参照を参照する

私はClojure関数make-transientとmake-persistentを前方宣言し、deftypeを定義して(関数を参照して)、既存の型を持つ関数を実装することができます。かなり美しいです。より良い選択肢がありますか?

編集:それはうまくいっても、それでもグロスです。

+0

今はテストできませんが、 "extend-type"を使用して2つのタイプを定義した後に機能を追加することは可能でしょうか? – mikera

+4

現在、ヘルパー関数の前方宣言以外のオプションはありません。私はそれが顕著な罰金を科すとは思わない(特に1.3)。しかし、別のことが働くかもしれません:asTransientメソッドの中でreifyを使って一時的な型を定義する - 私はテストしませんでしたが、別のコンパイラの制限を打つチャンスがあります(もしスタックトレースがスタブについて話したら、 。 – cgrand

+0

cgrandのコメントは完璧でした。それが答えだったら私はそれを受け入れるだろう。ここにコメントを追加するだけで、その問題を克服する方法を知っている人は誰でも知ることができます。 – amalloy

答えて

4

Clojure 1.3以降では、Clojureがdeftypes用に作成するコンストラクタ関数 - > transientおよび - > persistent!を使用するほうが少し簡単です。それらはマクロではなく関数なので、宣言しておくことができます。それで、あなた自身のmake-transientやmake-persistentではなく、それらを使うことができます。あなた自身で実装する必要はありません。

関連する問題