三个名称空间中的协议,实现和调用者

时间:2017-05-20 08:11:30

标签: clojure

我有三个文件/ ns称为world.cljnode.cljprotocols.cljNode记录实现了一个名为movable的协议。然后,我想从world.clj(维护节点状态等)调用它,但我无法弄清楚如何。我需要:require在哪里?

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:

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

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

我需要在world.clj中要求我在move中调用Node的实施内容?根据我的尝试,我会得到各种例外情况,例如下面的情况。

  • 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解决此问题,还是需要移动内容?在那种情况下,你会如何建议我组织这些东西呢?

1 个答案:

答案 0 :(得分:4)

defprotocol(除其他外)定义封闭命名空间中的函数。客户端就像调用任何常规函数一样调用这些“多态”函数。

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

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