The Recipes
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 re-define the original functions using the abstraction you
  created? Do so.
- Do the re-definitions 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 structs involved? If so, write down all the selector
  expressions. (Do so on a per-clause basis.)
- Does the data definition involve any self-references (or
  cross-references)? 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.
 Last modified: Wed Feb  7 22:10:37 EST 2007