无法创建系统协议

时间:2016-09-26 21:17:21

标签: clojure protocols

我正在写Entity Component System。我计划的部分目标是建立一个系统必须满足的协议System才能使用ECS。

问题是,如果我尝试创建一个名为System的协议,Clojure会抱怨;似乎是因为它与java.lang.System冲突。

(ns entity.system)

(defprotocol System
  ; Protocol methods)

产量

  

CompilerException java.lang.RuntimeException:期望var,但是System被映射到类java.lang.System,编译:(C:\ Users \ slomi \ IdeaProjects \ entity \ src \ entity \ system.clj:3:1 )

我尝试通过添加System(:refer-clojure :exclude [System])来排除(:refer-clojure :exclude [java.lang.System]),但都没有做任何事情;我再次收到同样的错误。

当然我可以将其他名称命名为其他名称,但System似乎是最合适的名称,entity.entity-system/Entity-System甚至entity.system/Entity-System之类似乎过于冗余。

如何从命名空间中排除java.lang.System

1 个答案:

答案 0 :(得分:4)

您正在寻找的是ns-unmap

(ns-unmap *ns* 'System)

(defprotocol System
  (add [this that]))

(extend-protocol System
  Long
  (add [this that]
    (format "%d + %d is %d" this that (+ this that))))

(add 2 3)
;;=> "2 + 3 is 5"