Chapter 2: Building Abstractions with Data   2.1   Introduction
We concentrated in Chapter 1 on computational processes and on
the role of functions in program design. We saw how to use
primitive data (numbers) and primitive operations (arithmetic
operations), how to form compound functions through composition
and control, and how to create functional abstractions by giving
names to processes. We also saw that higher-order functions
enhance the power of our language by enabling us to manipulate,
and thereby to reason, in terms of general methods of
computation. This is much of the essence of programming.  This
chapter focuses on data. Data allow us to represent and
manipulate information about the world using the computational
tools we have acquired so far. Programs without data structures
may suffice for exploring mathematical properties. But real-
world phenomena, such as documents, relationships, cities, and
weather patterns, all have complex structure that is best
represented using compound data types. Wi