If something is important, you should deal with it sooner and more often. That’s the approach Clojure takes to data representations. It means serialization of internal data is a non-issue.
“Prefer data over functions” is a common adage in Clojure circles. It is poorly debated because it is a terse statement in generalities. A valuable perspective is that data is transparent at runtime, while functions are not. This perspective gives a firm ground for discussion and design.
Token Bucket is a simple algorithm for rate limiting a resource. It’s easy to understand because you can reason about it in terms of real-world objects. core.async makes this algorithm very clear and easy.
Prepare for the Clojure/conj with media from around the web.
Clojure is an imperative language. Its operations are defined in terms of concrete actions. But those actions are often the same actions available to the programmer at runtime. This makes it easy to bootstrap.
Lisps are revered for their simple syntax, but parens are complex. They complect function calls and macro calls, which have drastically different semantics.
I wrote a lambda-calculus interpreter and an implementation of Hindley-Milner to type check it.
Null pointers are still a problem in Clojure, but several design decisions have made them less problematic than other languages.