Перегрузка оператора в Clojure - PullRequest
16 голосов
/ 08 октября 2009

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

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

Я очень новичок в Clojure, так что чья-то помощь здесь будет с благодарностью.

Ответы [ 2 ]

24 голосов
/ 08 октября 2009

Операторы 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")

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

6 голосов
/ 08 октября 2009

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

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

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

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

...