R. Mark Volkmann has put together a terrific Clojure Introduction. It starts with basic syntax and quickly works through all the core functions, broken out by categories such as "Collections", "Iteration" or "Concurrency".
Very brisk, but full of functions (from the core) that I didn't know of.
For example, here's a function I never noticed before, (get-in)
, as defined in the Clojure API
(get-in m ks) returns the value in a nested associative structure, where ks is a sequence of keys
That's accurate, but really encourages you to read the source or experiment in the REPL to see exactly how it works. Worse, its mixed in with hundreds of other functions and really easy to miss (I never noticed it before!).
Here's what the Clojure Introduction says:
To demonstrate this we'll create a map that describes a person. It has a key whose value describes their address using a map. It also has a key whose value describes their employer which has its own address map.(def person { :name "Mark Volkmann" :address { :street "644 Glen Summit" :city "St. Charles" :state "Missouri" :zip 63304} :employer { :name "Object Computing, Inc." :address { :street "12140 Woodcrest Executive Drive, Suite 250" :city "Creve Coeur" :state "Missouri" :zip 63141}}})
The get-in function takes a map and a key sequence. It returns the value of the nested map key at the end of the sequence. The -> macro and the reduce function can also be used for this purpose. All of these are demonstrated below to retrieve the employer city which is "Creve Coeur".
(get-in person [:employer :address :city]) (-> person :employer :address :city) ; explained below (reduce get person [:employer :address :city]) ; explained below
This is a document to keep linked and to print out and study. Thanks Mr. Volkmann!
Mark is presenting on clojure at the STL jug this month, in fact. I'm hoping to attend; looks like it'll be good based on his tutorial.
ReplyDelete