Я пытаюсь создать новый тип в Clojure с помощью deftype для реализации двумерной (x, y) координаты, которая реализует протокол "Location".
Я бы также хотел, чтобы этот инструмент реализовал стандартные методы Java, hashCode и toString.
Моя первоначальная попытка:
 (defprotocol Location   
   (get-x [p])  
   (get-y [p])   
   (add [p q]))
 (deftype Point [#^Integer x #^Integer y]   
     Location
       (get-x [p] x)
       (get-y [p] y) 
       (add [p q] 
         (let [x2 (get-x q)
               y2 (get-y q)]
           (Point. (+ x x2) (+ y y2))))   
     Object
       (toString [self] (str "(" x "," y ")"))
       (hashCode [self] (unchecked-add x (Integer/rotateRight y 16)))
       (equals [self b] 
         (and 
           (XXXinstanceofXXX Location b) 
           (= x (get-x b)) 
           (= y (get-y b)))))
Однако метод equals все еще нуждается в некотором способе разработки, если параметр b реализует протокол местоположения.
Каков правильный подход? Я на правильном пути?
