Я пытаюсь создать новый тип в 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 реализует протокол местоположения.
Каков правильный подход? Я на правильном пути?