というプロトコルがあり、それを実装IExampleするレコード タイプを定義します。A
(defprotocol IExample
(foo [this] "do something")
(bar [this] "do something else"))
(defrecord A [field1 field2]
IExample
(foo [this]
(+ field1 field2))
(bar [this]
(- field1 field2)))
Bこのプロトコルを実装するために別の (基本的な) 型を拡張したいが、 から に変換する方法を知っているとしましょBうA:
(defn B-to-A
"converts a B object to an A object"
[Bobj] ...)
この変換があるため、上のプロトコルのすべての呼び出しを委任することで、IExample上BのIExampleプロトコルにA委任できます。
(extend B
IExample {
:foo (fn [this] (foo (B-to-A this)))
:bar (fn [this] (bar (B-to-A this)))})
ただし、これは非常に多くのボイラープレート (特に大きなプロトコルの場合) であり、clojure の慣用句ではないようです。
関数を使用して、オブジェクトで関数が呼び出されるたびに暗黙的に変換Bするようにclojureに指示するにはどうすればよいですか?AIExampleBB-to-A