# The Little Schemer

by

Daniel Friedman and Matthias Felleisen

Edition

Fourth (4rth)

I read this book before starting on a scheme/physics project. I had programmed in scheme previously as an algebra/analysis tool, but never really sat down and got comfortable with the language. Working through all the examples has made me much more comfortable with this style of programming. Despite the humble tone and ambitions of the book I think I learned deeply.

The first 7 chapters were very straight forward, the end of chapter 8 took some more thought and I'm not sure how happy I am with the description of collectors and continuations.

For a better description of the Y-combinator, see these course notes.

This book is followed by The Seasoned Schemer and The Reasoned Schemer.

## Preface Definitions

This primitive function is required for most of the functions in the book:

``````(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))``````

## Laws

Law of Car

The primitive car is defined only for non-empty lists.

Law of Cdr

The primitive cdr is defined only for non-empty lists. The cdr of any non-empty list is always another list.

Law of Cons

The primitive cons takes two arguments. The second argument to cons must be a list. The result is a list.

Law of Null?

The primitive null? is defined only for lists.

Law of Eq?

The primitive eq? takes two arguments. Each must be a non-numeric atom.

## Commandments

The First Commandment

When recurring on a list of atoms, lat, ask two questions about it: (null? lat) and else. When recurring on a number, n, ask two questions about it: (zero? n) and else.

When recurring on a list of S-expressions, l, ask three questions about it: (null? l), (atom? (car l)), and else.

The Second Commandment

Use cons to build lists.

The Third Commandment

When building a list, describe the first typical element, and then cons it onto the natural recursion.

The Fourth Commandment

Always change at least one argument while recurring. It must be changed to be closer to termination. The changing argument must be tested in the termination condition:

when using cdr, test termination with null? and

when using sub1, test termination with zero?.

The Fifth Commandment

When building a value with +, always use 0 for the value of the terminating line, for adding 0 does not change the value of an addition.

When building a value with x, always use 1 for the value of the terminating line, for multiplying by 1 does not change the value of a multiplication.

When building a value with cons, always consider () for the value of the terminating line.

The Sixth Commandment

Simplify only after the function is correct.

The Seventh Commandment

Recur on the subpart that are of the same nature:

• on the sublists of a list.
• on the subexpressions of an arithmetic expression.
The Eighth Commandment

Use help functions to abstract from representations.

The Ninth Commandment

Abstract common patterns with a new function.

The Tenth Commandment

Build functions to collect more than one value at a time.