2017-05-20 9 views
2

world.clj,node.cljprotocols.cljという3つのファイル/ nがあります。 Nodeレコードは、movableというプロトコルを実装しています。それから私はworld.clj(これはノードの状態などを維持しています)からそれを呼びたいと思いますが、私はどのように把握できません。 :requireには何が必要ですか?3つの名前空間でのプロトコル、実装、呼び出し元

protocols.clj:

(ns mesh.protocols) 

(defprotocol movable 
    (move [this pos]) 

node.clj:

(ns mesh.node 
    (:require [mesh.protocols :refer [movable]])) 

(defrecord Node [...] 
    movable 
    (move [this pos] ...)) 

world.clj:私は呼び出すことができるようにworld.cljに要求する必要がありますどのような

(ns mesh.world 
    (:require ???)) 

(defn update-world [world] 
    ... 
    (move node new-pos)) 

Nodemoveの実装がありますか?私は何を試しているかによって以下のような様々な例外が発生します。

  • Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: move in this context, compiling:(mesh/world.clj:13:29)
  • Exception in thread "main" java.lang.IllegalAccessError: move does not exist, compiling:(mesh/world.clj:1:1)

それが正しい:requireでこれを解決することは可能ですか私はものを周りに移動する必要がありますか?そしてその場合、私は代わりに材料を整理することをどのようにお勧めしますか?

答えて

4

defprotocol(とりわけ)は、囲む名前空間に関数を定義します。クライアントは、通常の関数を呼び出すのと同じように、これらの多型関数を呼び出すだけです。

(ns mesh.world 
    (:require [mesh.protocols :as meshp])) 

(defn update-world [world] 
    ... 
    (meshp/move node new-pos)) 
+0

それは私のために物事をクリアしました。ありがとう! –

関連する問題