Carcigenicate
Carcigenicate

Reputation: 45745

Can't create a System protocol

I'm writing a Entity Component System. Part of my plan is to have a protocol called System that a system must fulfill to use the ECS.

The problem is, Clojure complains if I try to create a protocol called System; seemingly because it clashes with java.lang.System.

(ns entity.system)

(defprotocol System
  ; Protocol methods)

yields

CompilerException java.lang.RuntimeException: Expecting var, but System is mapped to class java.lang.System, compiling:(C:\Users\slomi\IdeaProjects\entity\src\entity\system.clj:3:1)

I tried excluding System by adding both (:refer-clojure :exclude [System]) and (:refer-clojure :exclude [java.lang.System]), but neither did anything; I received the same error again.

Of course I could just name it something else, but System seems the most appropriate name, and something like entity.entity-system/Entity-System or even entity.system/Entity-System seems overly redundant.

How can I exclude java.lang.System from the namespace?

Upvotes: 3

Views: 68

Answers (1)

Hoagy Carmichael
Hoagy Carmichael

Reputation: 1028

What you're looking for is 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"

Upvotes: 5

Related Questions