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.
clojure
Data > Functions > Macros. But why?
“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 Buckets with core.async
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.
Pre-conj Prep 2014
Prepare for the Clojure/conj with media from around the web.
Clojure is Imperative
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.
Complex Syntax
Lisps are revered for their simple syntax, but parens are complex. They complect function calls and macro calls, which have drastically different semantics.
Hindley-Milner in Clojure
I wrote a lambda-calculus interpreter and an implementation of Hindley-Milner to type check it.
Nil Punning (Or Null Pointers Considered Not So Bad)
Null pointers are still a problem in Clojure, but several design decisions have made them less problematic than other languages.