overriding - clojure -- correct way to locally override operators such as "+", "*", etc

ID : 274368

viewed : 20

Tags : clojureoverridingclojure





Top 5 Answer for overriding - clojure -- correct way to locally override operators such as "+", "*", etc

vote vote

98

You need to exclude the functions that are imported by core:

 (ns your-ns    (:refer-clojure :exclude [+ ...]))   (defn + ...) 
vote vote

89

Although I don't recommend overriding core functions like +, you could use binding or let for this, it depends on what behavior you want:

(let [+ -] (redu­ce + [1 2 3])) ; -4  (defn my-pl­us [x] (redu­ce + x)) (let [+ -] (my-p­lus [1 2 3])) ;6 (binding [+ -] (my-p­lus [1 2 3])); -4 

Like it has been said in the comments below, binding doesn't work this way anymore since clojure 1.3, since the var should be dynamic and +,-, etc aren't.

For testing purposes/mocking you could however get similar behaviour. In that case look at with-redefs (since clojure 1.3): http://clojuredocs.org/clojure_core/clojure.core/with-redefs

Also see: Let vs. Binding in Clojure

vote vote

75

Are you sure you want to do this? If yes, you could use defprotocol to specify what operators you want to override and extend the classes for which you want these overrides implemented. For a (contrived) example see my answer to this question.

vote vote

68

You can also override built in arithmetic using generic interfaces from contrib, see the following for a simple example,

http://nakkaya.com/2010/08/02/using-clojure-contrib-generic-interfaces/

vote vote

54

Top 3 video Explaining overriding - clojure -- correct way to locally override operators such as "+", "*", etc







Related QUESTION?