Итак, я хочу использовать java.awt.Color для чего-то, и я бы хотел написать такой код:
(use 'java.awt.Color)
(= Color/BLUE (- Color/WHITE Color/RED Color/GREEN))
Рассматривая основную реализацию -, речь идет конкретно о clojure.lang.Numbers, что для меня подразумевает, что я ничего не делаю, чтобы "подключиться" к основной реализации и расширить ее.
Оглядываясь в Интернете, кажется, есть две разные вещи:
-
Напишите свою собственную функцию
defn -, которая знает только о том типе данных, который им интересен. Чтобы использовать, вероятно, вы закончите префикс пространства имен, что-то вроде:(= Color/BLUE (scdf.color/- Color/WHITE Color/RED Color/GREEN))Или, альтернативно,
useв пространстве имен и используйтеclojure.core/-, если вы хотите математику чисел. -
Составьте специальный случай в реализации
-, который проходит доclojure.core/-, когда ваша реализация передаетсяNumber.
К сожалению, мне не нравится ни одно из них. Первое, пожалуй, самое чистое, поскольку второе делает предположение, что единственное, что вам нравится в математике, это их новый тип данных и номера.
Я новичок в Clojure, но не должен ли мы использовать Протоколы или Мультиметоды здесь, так что, когда люди создают/используют пользовательские типы, они могут "расширять" эти функции, чтобы они работали без видимых усилий? Есть ли причина, по которой +, - и т.д. Не поддерживает это? (или они? Они, кажется, не от моего чтения кода, но, возможно, я читаю его неправильно).
Если я хочу написать свои собственные расширения для обычных существующих функций, таких как + для других типов данных, как мне это сделать, чтобы он отлично сочетался с существующими функциями и потенциально другими типами данных?