Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing an accumulator function in Clojure

Tags:

clojure

I'd like to know how to write the accumulator example included in the Revenge of the Nerds essay. It's easy to understand how it works, however I fail to recreate it in Clojure - it doesn't accumulate but just returns the sum of i and the initial given value of n.

The key is in incf (in the Common Lisp version) or += (in JavaScript).

In other words: how to alter the state of a referenced function? I've seen some examples on mutating variables but they don't look precisely pretty do they?

like image 855
deprecated Avatar asked Dec 09 '11 07:12

deprecated


1 Answers

Don't doooo itttttt! Save yourself before it's too late! Mutating state for no reason is not something Clojure encourages, so of course it's not as convenient as it would be in common lisp.

But seriously, this is a classical example for explaining closures, and while it isn't one that really is very useful in Clojure, it's nice to know the translation. You would have to write something like:

(defn foo [n]
  (let [acc (atom n)]
    (fn [i] (swap! acc + i))))
like image 67
amalloy Avatar answered Oct 07 '22 07:10

amalloy