Clojure from the ground up: Macros
aphyr.com
aphyr.com
What is different about Clojure's implementation is that no changes to the compiler were required - 'deep walking macros' (http://blog.fogus.me/2013/07/17/an-introduction-to-deep-code...) were used - that actually restructure the code.
The benefit of this in the library is that when a process is blocked, the wait is converted to data and the thread is freed up and returned to the pool. You can have multiple processes talking to each other with a thread-pool size of one. (And still reason about the code in a neat way).
The benefit of this comes in the JavaScript environment, (via ClojureScript) where you can compile code that you would ordinarily coordinate with threads using CSP. (With Go-lang style operators)
You can see an example of this on David Nolen's pages here: * 10,000 processes http://swannodette.github.io/2013/08/02/100000-processes/ * 100,000 updates http://swannodette.github.io/2013/08/02/100000-dom-updates/
This is the power of macros in Clojure - things that would require a compiler extension in another language, are a library in Clojure.
Please go read up on modern scheme. particularly racket lang.
In many respects, Clojure is Racket, but on the JVM rather than native.
Racket has one of the most thoughtful, opininonated, and caring core dev groups of any language, bar none. Any implication otherwise comes from ignorance. :)
I believe immutable values are a result of programming style. A person can choose to use Clojure's Vars, Refs, Agents, and Atoms [1] even though Clojure tends to encourage a functional programming style. Clojure inherits the functional programming tradition from the larger Lisp family (as does Racket).
That said, Rich Hickey has a great of describing how to avoid unnecessary mutation - usually you want the next value so just make a new one rather than changing the existing one.
http://andreypopp.com/posts/2013-11-09-recreating-core-async...
http://swannodette.github.io/2013/08/24/es6-generators-and-c...
https://code.google.com/p/chibi-scheme/issues/detail?id=114#...
For most macros, this won't be an issue. But if you wind up with code-walking macros than can be nested, you need to be mindful of the nesting or your code might take a while to compile.