2010-12-31 13 views
1

私は自分のアプリケーションのデータを保存するためにClojureのSTMを使用したいが、データ構造を持っていることは目に見えないデータストアに構造を持続。自分の機能で組み込みの型を拡張して、APIのユーザーが気づかないようにするにはどうすればいいですか?私はすべての後、標準のClojureを使用したいSTMトランザクションにClojureのハッシュマップの過負荷を

ノートでは、それによって気づいていないAPIの呼び出し元を作り、データ構造を操作するために呼び出します。これも可能ですか?

+0

重複しているかどうかわからない:http://stackoverflow.com/questions/4522796/how-should-i-make-a-clojure-stm-program-persistent –

+0

何らかの点では重複です、はい。この質問では、私はclojureのコア関数のオーバーロードについてもっと調べようとしていました – Zubair

答えて

1

deftypeは新しいデータ構造型のものを作成するように設計されていますが、Clojure-in-ClojureとClojureの内部構造のプロトコル化が多くなるまで、これらの目標を達成できるかどうかはわかりません。私は間違っていることを愛するだろう。 :)

2

これは方法ですが、あなたはclojure.langからのインタフェース(プロトコル)を拡張することができるかどうかわかりません。ここでは、地図のassoc機能に副作用を追加するという、ごくわずかな例があります(必要に応じて)。

(deftype LolMap [m] 
    clojure.lang.IPersistentMap 
    (assoc [this k v] (do (println (str k " CAN HAS " v "!")) 
         (LolMap. (assoc m k v)))) 
    clojure.lang.Seqable 
    (seq [this] (seq m))) 

タイプは、本物のマップをラップし、あなたは(IPersistentMapとSeqableはREPLでインスタンスをインスタンス化して印刷することができるようにする最低限です)関与するすべての のインターフェイスのための適切な実装を提供する必要があります。すべての読み取り操作では、実際のマップ関数を実装として渡すだけで十分です。

+0

私のコードでこの修正されたバージョンを使用するにはどうすれば私のclojure.coreインポートを上書きできますか? – Zubair

+0

あなたはそうしないでしょう。これは、多型がデータ型とプロトコルを使ってクロージャーでどのように機能するかです。 'assoc'関数はすべての「通常」のマップで同じです。カスタム型に適用されたときにのみ、実装(最初の引数の型にディスパッチ)を使用します。 – casphas

+0

私はまだ理解していませんが、私はClojureタイプについていくつかの調査を行い、次にこれに戻ってきます。あなたの入力をありがとう – Zubair

関連する問題