I give the authors kudos for recognizing that there is a huge gap in books targeted at professional programmers (or at least applied computer scientists) about advanced topics in academic research that can actually help with writing solid, maintainable code, code that not only gets the job done but that can survive months or years of modification at the hands of others. That being said, and I say this as a target reader who gleefully devoured the 400 pages or so, Scheme snippets and all, I'm not sure this is the book they intended to write. They seem to take for granted that the multiple techniques covered (DSLs, combinators, interpreters, pattern-matching, backtracking, layering/AOP, propagation networks) are superior to the normal way of writing programs (what that is, of course, they never really say). They don't actually provide any evidence for this claim. There is also no account of popular software libraries that are written in alternate styles yet have been maintained for many years without sacrificing adaptability or extensibility (i.e. Spring, Netty, Lucene, JUnit). Perhaps they think their elucidation of each technique using some real-life examples will prove the usefulness of the approach. The examples are the best part of the book. They present large snippets of Scheme code and work through stages of increased difficulty. The examples are tilted toward an academic audience, however: strategy games, numerical calculations, unit conversions. I would have liked to see more real-world examples from the domain of professional programming: ORM, UI composition and rendering, workflow state machine, control systems, robotics. They do present a novel method of datum layering used for data provenance that may prove useful in visualizing the results of automated reasoning programs (though how this would translate to ML is left out). Programmers will recognize techniques from the chapters on combinators, DSLs, interpreters, though they may not have encountered those techniques in practice, certainly not in Scheme. Java and JavaScript have popularized lambdas and higher-order functions. Pattern matching has become fairly well known outside of functional programming due to Scala and, more recently, Swift. The layering technique is based on AOP, though the authors present a novel dispatcher model based on CLOS. Propagation networks resemble recent graph processing frameworks such as Google's Pregel. The authors' presentation of all this material is surprisingly compact and highly readable, so programmers will benefit from having it all in one place and with such detailed examples (the complete source code can be downloaded as well). The most suggestive and unfinished part of the book is the authors' use of recent findings in evolutionary biology and genetics to suggest radically different approaches to programming. One concept they mention repeatedly is degeneracy, the capability of one failing mechanism to be replaced by another mechanism that may have evolved for alternate purposes. They attempt to show an example of how degeneracy can be put to use in calculations that depend on prior assumptions that can vary in accuracy, but the example doesn't really lead to any "ah-ha" moment. One gets the impression they are attempting to show their students an interesting topic for a future research project. Good fun, yes, but not part of a programmer's toolkit just yet.