 Design Recipe for Abstraction
Are the function definitions similar? The answer is certainly yes, if
they are based on the same template. If not, reconsider abstracting over
them.  Mark the differences in pairs and connect the pairs via lines;
we call those difference lines.

Create a function definition that looks just like one of the two. Give it
a new distinct name. Add one parameter to the function header per
"difference lines". Also add those parameters to the recursive calls.
Use the parameters where the different expressions used to be.

Can you redefine the original functions using the abstraction you
created? Do so.

Do the redefinitions pass the test suites for the original functions? If
not, you're in trouble.

Develop a general contract for the abstraction.

State the purpose statement in terms of "..." terms. See page 313 in How
to Design Programs.
Design Recipe for Structural Data What kinds of data are involved? Create data definitions. If they look
complex, construct examples according to the data definitions, just to
make sure they work.
 What kinds of data does the function consume? Which kind does it
produce? And what is its purpose? (in one line)
 Can you make up examples of inputs? What should the function produce
for these inputs?
 Let's construct the template:
 Does the data definition (of the main argument) mention clauses? If
so, use a
cond with as many cases as there are clauses in
the data definition.
 How can you distinguish these kinds of data with conditions involving
the main parameter?
 Are
struct s involved? If so, write down all the selector
expressions. (Do so on a perclause basis.)
 Does the data definition involve any selfreferences (or
crossreferences)? If so, use recursion in the template to express these
"arrows".
 Let's code:
 Can you deal with the simple
cond cases? Your examples
should give you some hints.
 What do the expressions in the recursive cases compute? Use the purpose
statement of the function to figure out what the recursive function
application computes.
 How can you combine the results of these expressions so that the
function returns the desired value?
 Did you turn the examples into tests? You may want to do this as you
develop functional examples.
