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

Другие вопросы по тегам