This student textbook should be considered as an expanded and enhanced tutorial version of the well-known book [1] by Peyton Jones. While the earlier work is an excellent introduction to the theoretical background and main techniques for implementing lazy functional languages using graph reduction, this book gives hands-on experience by building working prototypes of several implementations of a carefully chosen simple functional language called Core.
The implementations, each discussed in a separate chapter, are a template-instantiation, the G-machine, the three instruction machine (TIM), and the parallel G-machine. In each case, the authors lead the reader to the working prototype through a sequence of refinements and improvements. They present the executable machine code at each step, thus allowing development, modifications, and experiments with it. As they note in the preface, “The unusual aspect of this book is that it is meant to be executed as well as read.”
An important topic not covered is the translation of existing high-level functional languages into Core. A chapter on lambda-lifting provides some useful details about that process, but the reader is referred to the earlier work [1] for a full explanation. Therefore, this book cannot be used directly as a guide for implementers of functional languages; in this sense, it is not self-contained.
The book is addressed primarily to graduate students with a significant knowledge of functional programming and compiler and interpreter methods. A modest knowledge of Miranda (the prototyping functional language) would be helpful; other readers will need to study the details of the language and the utility programs provided in the appendices.
Although the authors provide email addresses from which source files can be obtained, a useful complement to the book for lab work would be a disk containing all sources and variants of implementations along with some documentation. I recommend this well-written and pragmatic book as a useful tutorial for anybody interested in modern implementation techniques for functional languages.