オーバーロードされたプロトコル定義の一部は次のとおりです。
(defprotocol ClientProtocol
(create-edge
[this outV label inV]
[this outV label inV data])
そして、ここにその実装の一部があります:
(ns bulbs.neo4jserver.client
(:use [bulbs.base.client :only [ClientProtocol]]))
(deftype Neo4jClient [ns config]
ClientProtocol
(create-edge
[this outV label inV data]
(let [inV-uri (utils/normalize-uri (build-path neo4j-uri vertex-path inV))
path (build-path vertex-path, outV, "relationships")
params {:to inV-uri, :type label, :data (first data)}]
(post config path params)))
(create-edge
[this outV label inV]
;; it doesn't like this call...
(create-edge this outV label inV nil))
2番目のメソッドが最初のメソッドを呼び出そうとすると、このエラーが発生します。
java.lang.RuntimeException: Unable to resolve symbol: create-edge in this context
SLIMEで最初の関数を使用してコンパイルし、次に戻って2番目の関数を追加したときに、両方の定義が機能していました。
しかし、プロトコル定義を別のファイルに移動してすべてを再コンパイルしようとすると、おそらく最初のメソッドがまだ定義されていないために、2番目のメソッドが最初のメソッドを呼び出そうとするとエラーがスローされます。
Clojureのreify
ドキュメントには次のコメントがあります:
プロトコル/インターフェースでメソッドがオーバーロードされている場合は、複数の独立したメソッド定義を指定する必要があります。
http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify
これらは独立した定義ではないと思います。
これにアプローチする正しい方法は何ですか?