I am still going through the tutorials on Purely Functional. It is taking longer than I thought. I might start going through Luminus at the same time as well. I think that building something while going through the lessons are a better way to learn.
In one of the lessons on Purely Functional, there is an interesting use of anonymous functions.
In version 3.17 of core.clj, we saw this in the function add:
(defn add ([ingredient] (add ingredient 1)) ([ingredient amount] (cond (squeezed? ingredient) (add-squeezed ingredient amount) (scooped? ingredient) (add-scooped ingredient amount) (simple? ingredient) (add-simple ingredient amount) :else (error "I do not know the ingredient" ingredient))))
We see a call to “cond”. It uses the type of the ingredient to decide which function to call.
In version 3.18 of core.clj, he adds a map with anonymous functions:
(def usage {:squeezed (fn [ingredient amount] (dotimes [i amount] (grab ingredient) (squeeze) (add-to-bowl))) :simple (fn [ingredient amount] (dotimes [i amount] (grab ingredient) (add-to-bowl))) :scooped (fn [ingredient amount] (grab :cup) (dotimes [i amount] (scoop ingredient) (add-to-bowl)) (release))})
In version 3.19 of core.clj, he gets the functions out of the map and sets them equal to a symbol, replacing the cond:
(defn add ([ingredient] (add ingredient 1)) ([ingredient amount] (let [ingredient-type (usage-type ingredient)] (if (contains? usage ingredient-type) (let [f (get usage ingredient-type)] (f ingredient amount)) (error "I do not know the ingredient" ingredient)))))
I will also look into Apache Kafka. I went to the Apache Kafka meetup recently. I think it will be important going forward.
You’re welcome.
Image from the Menologion of Basil II, an 11th century manuscript housed in the Vatican Library; image from Wikimedia, assumed allowed under Fair Use.