Итак, я хочу использовать 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, но не должен ли мы использовать Протоколы или Мультиметоды здесь, так что, когда люди создают/используют пользовательские типы, они могут "расширять" эти функции, чтобы они работали без видимых усилий? Есть ли причина, по которой +
, -
и т.д. Не поддерживает это? (или они? Они, кажется, не от моего чтения кода, но, возможно, я читаю его неправильно).
Если я хочу написать свои собственные расширения для обычных существующих функций, таких как +
для других типов данных, как мне это сделать, чтобы он отлично сочетался с существующими функциями и потенциально другими типами данных?