Перегрузка оператора в 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-адресе мультиметодов, приведенном выше, вы можете создать функцию, которая сообщает вашей. +, какую реализацию использовать.