Перегрузка оператора в Clojure
Даже внимательно изучая документацию по Clojure, я не вижу прямого подтверждения того, поддерживает ли Clojure перегрузку операторов.
Если да, может кто-нибудь дать мне небольшой фрагмент о том, как перегрузить, скажем, оператор "+" для делегирования некоторому предопределенному методу, который мы можем вызвать myPlus
,
Я очень новичок в Clojure, поэтому чья-то помощь здесь будет с благодарностью.
2 ответа
Операторы Clojure (как и любой другой Лисп) являются простыми функциями; Вы можете определить "оператор" как функцию:
(defn ** [x y] (Math/pow x y))
Оператор "+" (и некоторые другие математические операторы) является частным случаем в Clojure, поскольку он встроенный (по крайней мере, для двоичного случая). Вы можете в определенной степени избежать этого, не обращаясь к clojure.core
(или исключая clojure.core/+
) в вашем пространстве имен, но это может быть очень волосатым.
Чтобы создать пространство имен, где + переопределяется:
(ns my-ns
(:refer-clojure :exclude [+]))
(defn + [x y] (println x y))
(+ "look" "ma")
Вероятно, одной из хороших стратегий было бы сделать ваш + мультиметодом и вызвать функцию ядра + для числовых случаев.
Взгляните на это: http://clojure.org/multimethods
Некоторые функции, такие как +, являются основными и не могут быть переопределены.
Вы можете создать новую функцию и вызвать ее, например, ". +" Или "! +", Что аналогично с точки зрения читабельности.
Используя информацию в URL-адресе мультиметода, приведенную выше, вы можете создать функцию, которая сообщит вашему. +, Какую реализацию использовать.