I’ve been trying to expand my programming lately by learning some new languages, specifically ones that fill niches that Python doesn’t. These have included Rust, Go, and Clojure, but I think I’m having the most fun with Clojure (though both Rust and Go are also great, they’re just not as much fun.)
(Spoiler Warning: This post contains my solution for Project Euler Problem #2. If you don’t want to be spoiled on a potential strategy for the answer, you should find your own solution before reading the rest of this post.)
As an example, here’s a bit of Clojure I wrote to solve Project Euler problem #2:
(reduce
+
(filter
even?
(loop [result [1 2]]
(let [z (reduce + (take-last 2 result))]
(if (> z 4000000)
result
(recur
(conj result z))))))
This gives the right answer, but its not exactly great code, is it? Let’s try and improve things a bit.
First thing that jumps out is the lack of reusability. We can fix that by putting the whole thing into a function:
(defn fib-euler
"Returns the sum of all the even fibonacci numbers up to the limit
provided"
[limit]
(reduce
+
(filter
even?
(loop [result [1 2]]
(let [z (reduce + (take-last 2 result))]
(if (> z limit)
result
(recur
(conj result z))))))))
So now we’ve got a reusable function for our problem, and we’ve even added some documentation as well as making the limit a parameter we can pass to the function.