Notice that some things which are "global" from the point of view of the application, such as my web server and scheduled thread pool, become "local" instances in this data structure. Any function which needs one of these components has to take it as a parameter. This isn't as burdensome as it might seem: each function gets, at most, one extra argument providing the "context" in which it operates. That context could be the entire system object, but more often will be some subset. With judicious use of lexical closures, the extra arguments disappear from most code. In addition to enabling more interactive development, this approach makes testing easier. See my post On the Perils of Dynamic Scope for more background, as well as the Clojure/West talk when it comes out.