Last weekend I did a talk about Clojure and abstraction at the CodepaLOUsa conference in Louisville, KY. At the end of it I summarized the list of features and what kind of abstraction they support:
- Functions (name and manipulate code as a unit)
- Collections (trait-based, immutable collections of data)
- Seq (logical list view of a sequence of values)
- Records (data types)
- Multimethods, protocols (polymorphism and function dispatch)
- Atoms, refs, agents (concurrency, state)
- Macros (syntax, order of evaluation)
- Namespaces (modularity)
- Metadata (out-of-band information)
When I wrote that list down, it was actually pretty impressive. What I really like is how these are not just a great set of abstractions but how they actually support each other. I mentioned when I did this talk that really each of these topics is itself worthy of a whole talk and in fact, various Clojure gurus have done talks about many of these which I’ve linked into the list above.
I’ll be doing this talk a few more times in the next few months and will continue refining my talk. In particular, I think the talk is lacking a compelling example of how these abstractions come together; it’s missing the holistic view of what it feels like to have these abstractions available. Of course, doing that in a presentation is hard. :) But I accept the challenge…