Перегрузка оператора в Clojure

Даже внимательно глядя на документацию по Clojure, я не вижу прямого подтверждения относительно того, поддерживает ли Clojure перегрузку оператора.

Если это так, может ли кто-нибудь дать мне быстрый snipplet, как перегрузить, допустим, оператор "+", чтобы делегировать какой-либо предопределенный метод, который мы можем назвать myPlus.

Я очень новичок в Clojure, поэтому кто-то здесь поможет.

Ответ 1

Clojure (как и любые Lisp) операторы - простые функции; вы можете определить "оператор" как функцию:

(defn ** [x y] (Math/pow x y))

Оператор "+" (и некоторые другие математические операторы) является частным случаем в Clojure, так как он inlined (для двоичного случая, по крайней мере). Вы можете в определенной степени избежать этого, не ссылаясь на clojure.core (или исключая clojure.core/+) в своем пространстве имен, но это может быть очень волосатым.

Чтобы создать пространство имен, где + переопределено:

(ns my-ns
  (:refer-clojure :exclude [+]))

(defn + [x y] (println x y))

(+ "look" "ma")

Одна хорошая стратегия, вероятно, заключалась бы в том, чтобы сделать ваш + мультиметод и вызвать функцию ядра + для числовых случаев.

Ответ 2

Взгляните на это: http://clojure.org/multimethods

Некоторые функции, такие как +, являются ядром и не могут быть переопределены.

Вы можете создать новую функцию и назвать ее ". +" или "! +", например, которая похожа на читаемость.

Используя информацию в URL-адресе мультиметодов, приведенном выше, вы можете создать функцию, которая сообщает вашей. +, какую реализацию использовать.