无法创建系统协议

3

我正在编写一个实体组件系统(Entity Component System)。我的计划中有一个名为System的协议,每个系统必须遵守这个协议才能使用ECS。

问题在于,如果我尝试创建一个名为System的协议,Clojure会报错,似乎是因为与java.lang.System冲突。

(ns entity.system)

(defprotocol System
  ; Protocol methods)

yields

编译器异常 java.lang.RuntimeException: 预期 var,但 System 被映射到类 java.lang.System,compiling:(C:\Users\slomi\IdeaProjects\entity\src\entity\system.clj:3:1)

我尝试通过添加 (:refer-clojure :exclude [System])(:refer-clojure :exclude [java.lang.System]) 来排除System,但都没有任何作用;我收到了同样的错误信息。

当然,我可以给它起一个别的名字,但是System似乎是最合适的名称,像entity.entity-system/Entity-System 或者entity.system/Entity-System 这样的名称显得过于冗长。

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

1个回答

5
你需要的是 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"

可爱。谢谢。 - Carcigenicate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接