\contentsline {part}{Preface}{xv} \contentsline {subsection}{Why Everyone Should Learn to Program}{xvii} \contentsline {subsection}{Design Recipes}{xix} \contentsline {subsection}{The Choice of Scheme}{xxi} \contentsline {subsection}{The Parts of the Book}{xxiii} \contentsline {subsection}{Acknowledgements}{xxvii} \contentsline {part}{I\hspace {1em}Processing Simple Forms of Data}{3} \contentsline {section}{\numberline {1}Students, Teachers, and Computers}{4} \contentsline {section}{\numberline {2}Numbers, Expressions, Simple Programs}{5} \contentsline {subsection}{\numberline {2.1}Numbers and Arithmetic}{6} \contentsline {subsection}{\numberline {2.2}Variables and Programs}{8} \contentsline {subsection}{\numberline {2.3}Word Problems}{12} \contentsline {subsection}{\numberline {2.4}Errors}{13} \contentsline {subsection}{\numberline {2.5}Designing Programs}{17} \contentsline {section}{\numberline {3}Programs are Function and Variable Definitions}{22} \contentsline {subsection}{\numberline {3.1}Composing Functions}{23} \contentsline {subsection}{\numberline {3.2}Variable Definitions}{26} \contentsline {subsection}{\numberline {3.3}Finger Exercises on Composing Functions}{27} \contentsline {section}{\numberline {4}Conditional Expressions and Functions}{29} \contentsline {subsection}{\numberline {4.1}Booleans and Relations}{29} \contentsline {subsection}{\numberline {4.2}Functions that Test Conditions}{32} \contentsline {subsection}{\numberline {4.3}Conditionals and Conditional Functions}{37} \contentsline {subsection}{\numberline {4.4}Designing Conditional Functions}{40} \contentsline {section}{\numberline {5}Symbolic Information}{45} \contentsline {subsection}{\numberline {5.1}Finger Exercises with Symbols}{48} \contentsline {section}{\numberline {6}Compound Data, Part 1: Structures}{50} \contentsline {subsection}{\numberline {6.1}Structures}{51} \contentsline {subsection}{\numberline {6.2}Extended Exercise: Drawing Simple Pictures}{54} \contentsline {subsection}{\numberline {6.3}Structure Definitions}{57} \contentsline {subsection}{\numberline {6.4}Data Definitions}{62} \contentsline {subsection}{\numberline {6.5}Designing Functions for Compound Data}{64} \contentsline {subsection}{\numberline {6.6}Extended Exercise: Moving Circles and Rectangles}{71} \contentsline {subsection}{\numberline {6.7}Extended Exercise: Hangman}{75} \contentsline {section}{\numberline {7}The Varieties of Data}{78} \contentsline {subsection}{\numberline {7.1}Mixing and Distinguishing Data}{79} \contentsline {subsection}{\numberline {7.2}Designing Functions for Mixed Data}{84} \contentsline {subsection}{\numberline {7.3}Composing Functions, Revisited}{89} \contentsline {subsection}{\numberline {7.4}Extended Exercise: Moving Shapes}{92} \contentsline {subsection}{\numberline {7.5}Input Errors}{92} \contentsline {part}{Intermezzo 1: Syntax and Semantics}{95} \contentsline {subsection}{The Scheme Vocabulary}{96} \contentsline {subsection}{The Scheme Grammar}{96} \contentsline {subsection}{The Meaning of Scheme}{99} \contentsline {subsection}{Errors}{103} \contentsline {subsection}{Boolean Expressions}{106} \contentsline {subsection}{Variable Definitions}{107} \contentsline {subsection}{Structure Definitions}{109} \contentsline {part}{II\hspace {1em}Processing Arbitrarily Large Data}{113} \contentsline {section}{\numberline {9}Compound Data, Part 2: Lists}{114} \contentsline {subsection}{\numberline {9.1}Lists}{114} \contentsline {subsection}{\numberline {9.2}Data Definitions for Lists of Arbitrary Length}{119} \contentsline {subsection}{\numberline {9.3}Processing Lists of Arbitrary Length}{121} \contentsline {subsection}{\numberline {9.4}Designing Functions for Self-Referential Data Definitions}{125} \contentsline {subsection}{\numberline {9.5}More on Procssing Simple Lists}{127} \contentsline {section}{\numberline {10}More on Processing Lists}{133} \contentsline {subsection}{\numberline {10.1}Functions that Produce Lists}{133} \contentsline {subsection}{\numberline {10.2}Lists that Contain Structures}{139} \contentsline {subsection}{\numberline {10.3}Extended Exercise: Moving Pictures}{146} \contentsline {section}{\numberline {11}Natural Numbers}{148} \contentsline {subsection}{\numberline {11.1}Defining Natural Numbers}{148} \contentsline {subsection}{\numberline {11.2}Processing Natural Numbers of Arbitrary Size}{150} \contentsline {subsection}{\numberline {11.3}Extended Exercise: Creating Lists, Testing Functions}{153} \contentsline {subsection}{\numberline {11.4}Alternative Data Definitions for {\bf N}}{155} \contentsline {subsection}{\numberline {11.5}More on the Nature of Natural Numbers}{161} \contentsline {section}{\numberline {12}Composing Functions, Revisited Again}{163} \contentsline {subsection}{\numberline {12.1}Designing Complex Programs}{163} \contentsline {subsection}{\numberline {12.2}Recursive Auxiliary Functions}{165} \contentsline {subsection}{\numberline {12.3}Generalizing Problems, Generalizing Functions}{170} \contentsline {subsection}{\numberline {12.4}Extended Exercise: Rearranging Words}{174} \contentsline {part}{{Intermezzo 2: List Abbreviations}}{177} \contentsline {part}{III\hspace {1em}More on Processing Arbitrarily Large Data}{182} \contentsline {section}{\numberline {14}More Self-referential Data Definitions}{183} \contentsline {subsection}{\numberline {14.1}Structures in Structures}{183} \contentsline {subsection}{\numberline {14.2}Extended Exercise: Binary Search Trees, Part 1}{193} \contentsline {subsection}{\numberline {14.3}Lists in Lists}{198} \contentsline {subsection}{\numberline {14.4}Extended Exercise: Evaluating Scheme}{201} \contentsline {section}{\numberline {15}Mutually Referential Data Definitions}{203} \contentsline {subsection}{\numberline {15.1}Lists of Structures, Lists in Structures}{203} \contentsline {subsection}{\numberline {15.2}Designing Functions for Mutually-Referential Definitions}{211} \contentsline {subsection}{\numberline {15.3}Extended Exercise: More on Web Pages}{214} \contentsline {section}{\numberline {16}Development through Iterative Refinement}{215} \contentsline {subsection}{\numberline {16.1}Data Analysis}{216} \contentsline {subsection}{\numberline {16.2}Defining Data Classes and Refining Them}{217} \contentsline {subsection}{\numberline {16.3}Refining Functions and Programs}{220} \contentsline {section}{\numberline {17}Processing Two Complex Pieces of Data}{222} \contentsline {subsection}{\numberline {17.1}Processing Two Lists Simultaneously: Case 1}{222} \contentsline {subsection}{\numberline {17.2}Processing Two Lists Simultaneously: Case 2}{224} \contentsline {subsection}{\numberline {17.3}Processing Two Lists Simultaneously: Case 3}{228} \contentsline {subsection}{\numberline {17.4}Function Simplification}{232} \contentsline {subsection}{\numberline {17.5}Designing Functions that Consume Two Complex Inputs}{234} \contentsline {subsection}{\numberline {17.6}Exercises on Processing Two Complex Inputs}{236} \contentsline {subsection}{\numberline {17.7}Extended Exercise: Evaluating Scheme, Part 2}{240} \contentsline {subsection}{\numberline {17.8}Equality and Testing}{242} \contentsline {part}{{Intermezzo 3: Local Definitions and Lexical Scope}}{252} \contentsline {subsection}{{Organizing Programs: {\bf local}}}{252} \contentsline {subsection}{{Lexical Scope and Block Structure}}{268} \contentsline {part}{IV\hspace {1em}Abstracting Designs}{274} \contentsline {section}{\numberline {19}Similarities in Definitions}{275} \contentsline {subsection}{\numberline {19.1}Similarities in Functions}{275} \contentsline {subsection}{\numberline {19.2}Similarities in Data Definitions}{285} \contentsline {section}{\numberline {20}Functions are Values}{291} \contentsline {subsection}{\numberline {20.1}Syntax and Semantics}{291} \contentsline {subsection}{\numberline {20.2}Contracts for Abstract and Polymorphic Functions}{293} \contentsline {section}{\numberline {21}Designing Abstractions from Examples}{297} \contentsline {subsection}{\numberline {21.1}Abstracting from Examples}{298} \contentsline {subsection}{\numberline {21.2}Finger Exercises with Abstract List Functions}{304} \contentsline {subsection}{\numberline {21.3}Abstraction and a Single Point of Control}{307} \contentsline {subsection}{\numberline {21.4}Extended Exercise: Moving Pictures, Again}{308} \contentsline {subsection}{\numberline {21.5}Note: Designing Abstractions from Templates}{309} \contentsline {section}{\numberline {22}Designing Abstractions with First-Class Functions}{311} \contentsline {subsection}{\numberline {22.1}Functions that Produce Functions}{311} \contentsline {subsection}{\numberline {22.2}Designing Abstractions with Functions-as-Values}{313} \contentsline {subsection}{\numberline {22.3}A First Look at Graphical User Interfaces}{317} \contentsline {section}{\numberline {23}Mathematical Examples}{326} \contentsline {subsection}{\numberline {23.1}Sequences and Series}{326} \contentsline {subsection}{\numberline {23.2}Arithmetic Sequences and Series}{328} \contentsline {subsection}{\numberline {23.3}Geometric Sequences and Series}{329} \contentsline {subsection}{\numberline {23.4}The Area Under a Function}{333} \contentsline {subsection}{\numberline {23.5}The Slope of a Function}{335} \contentsline {part}{{Intermezzo 4: Defining Functions on the Fly}}{341} \contentsline {subsection}{Syntax of {\bf lambda}}{341} \contentsline {subsection}{Scope and Semantics of {\bf lambda}}{342} \contentsline {subsection}{Pragmatics of {\bf lambda}}{346} \contentsline {part}{V\hspace {1em}Generative Recursion}{347} \contentsline {section}{\numberline {25}Generative Recursion and Algorithms}{348} \contentsline {subsection}{\numberline {25.1}Modeling a Ball on a Table}{349} \contentsline {subsection}{\numberline {25.2}Sorting Quickly}{353} \contentsline {section}{\numberline {26}Designing Algorithms}{358} \contentsline {subsection}{\numberline {26.1}Termination}{361} \contentsline {subsection}{\numberline {26.2}Structural versus Generative Recursion}{364} \contentsline {subsection}{\numberline {26.3}Making Choices}{365} \contentsline {section}{\numberline {27}Variations on a Theme}{370} \contentsline {subsection}{\numberline {27.1}Fractals}{371} \contentsline {subsection}{\numberline {27.2}From Files to Lines, From Lists to Lists of Lists}{375} \contentsline {subsection}{\numberline {27.3}Binary Search}{380} \contentsline {subsection}{\numberline {27.4}Newton's Method}{388} \contentsline {subsection}{\numberline {27.5}Extended Exercise: Gaussian Elimination}{390} \contentsline {section}{\numberline {28}Algorithms that Backtrack}{395} \contentsline {subsection}{\numberline {28.1}Traversing Graphs}{395} \contentsline {subsection}{\numberline {28.2}Extended Exercise: Checking (on) Queens}{402} \contentsline {part}{{Intermezzo 5: The Cost of Computing and Vectors}}{405} \contentsline {subsection}{Concrete Time, Abstract Time}{405} \contentsline {subsection}{The Definition of ``on the Order of''}{411} \contentsline {subsection}{A First Look at Vectors}{413} \contentsline {part}{VI\hspace {1em}Accumulating Knowledge}{426} \contentsline {section}{\numberline {30}The Loss of Knowledge}{427} \contentsline {subsection}{\numberline {30.1}A Problem with Structural Processing}{427} \contentsline {subsection}{\numberline {30.2}A Problem with Generative Recursion}{431} \contentsline {section}{\numberline {31}Designing Accumulator-Style Functions}{436} \contentsline {subsection}{\numberline {31.1}Recognizing the Need for Accumulator}{436} \contentsline {subsection}{\numberline {31.2}Accumulator-Style Functions}{438} \contentsline {subsection}{\numberline {31.3}Transforming Functions into Accumulator-Style}{440} \contentsline {section}{\numberline {32}More Uses of Accumulation}{451} \contentsline {subsection}{\numberline {32.1}Extended Exercise: Accumulators on Trees}{451} \contentsline {subsection}{\numberline {32.2}Extended Exercise: Missionaries and Cannibals}{457} \contentsline {subsection}{\numberline {32.3}Extended Exercise: Board Solitaire}{461} \contentsline {part}{{Intermezzo 6: The Nature of Inexact Numbers}}{463} \contentsline {subsection}{Fixed-size Number Arithmetic}{463} \contentsline {subsection}{Overflow}{469} \contentsline {subsection}{Underflow}{470} \contentsline {subsection}{DrScheme's Numbers}{471} \contentsline {part}{VII\hspace {1em}Changing the State of Variables}{473} \contentsline {section}{\numberline {34}Memory for Functions}{474} \contentsline {section}{\numberline {35}Assignment to Variables}{478} \contentsline {subsection}{\numberline {35.1}Simple Assignments at Work}{479} \contentsline {subsection}{\numberline {35.2}Sequencing Expression Evaluations}{481} \contentsline {subsection}{\numberline {35.3}Assignments and Functions}{484} \contentsline {subsection}{\numberline {35.4}A First Useful Example}{486} \contentsline {section}{\numberline {36}Designing Functions with Memory}{490} \contentsline {subsection}{\numberline {36.1}The Need for Memory}{490} \contentsline {subsection}{\numberline {36.2}Memory and State Variables}{492} \contentsline {subsection}{\numberline {36.3}Functions that Initialize Memory}{494} \contentsline {subsection}{\numberline {36.4}Functions that Change Memory}{495} \contentsline {section}{\numberline {37}Examples of Memory Usage}{503} \contentsline {subsection}{\numberline {37.1}Initializing State}{503} \contentsline {subsection}{\numberline {37.2}State Changes from User Interactions}{506} \contentsline {subsection}{\numberline {37.3}State Changes from Recursion}{516} \contentsline {subsection}{\numberline {37.4}Finger Exercises on State Changes}{523} \contentsline {subsection}{\numberline {37.5}Extended Exercise: Exploring Places}{526} \contentsline {part}{{Intermezzo 7: The Final Syntax and Semantics}}{529} \contentsline {subsection}{The Vocabulary of Advanced Scheme}{529} \contentsline {subsection}{The Grammar of Advanced Scheme}{529} \contentsline {subsection}{The Meaning of Advanced Scheme}{532} \contentsline {subsection}{Errors in Advanced Scheme}{547} \contentsline {part}{VIII\hspace {1em}Changing Compound Values}{552} \contentsline {section}{\numberline {39}Encapsulation}{553} \contentsline {subsection}{\numberline {39.1}Abstracting with State Variables}{553} \contentsline {subsection}{\numberline {39.2}Practice with Encapsulation}{564} \contentsline {section}{\numberline {40}Mutable Structures}{566} \contentsline {subsection}{\numberline {40.1}Structures from Functions}{566} \contentsline {subsection}{\numberline {40.2}Mutable Functional Structures}{569} \contentsline {subsection}{\numberline {40.3}Mutable Structures}{572} \contentsline {subsection}{\numberline {40.4}Mutable Vectors}{580} \contentsline {subsection}{\numberline {40.5}Changing Variables, Changing Structures}{582} \contentsline {section}{\numberline {41}Designing Functions that Change Structures}{586} \contentsline {subsection}{\numberline {41.1}Why Mutate Structures}{586} \contentsline {subsection}{\numberline {41.2}Structural Design Recipes and Mutation, Part 1}{587} \contentsline {subsection}{\numberline {41.3}Structural Design Recipes and Mutation, Part 2}{600} \contentsline {subsection}{\numberline {41.4}Extended Exercise: Moving Pictures, a Last Time}{614} \contentsline {section}{\numberline {42}Equality}{614} \contentsline {subsection}{\numberline {42.1}Extensional Equality}{615} \contentsline {subsection}{\numberline {42.2}Intensional Equality}{616} \contentsline {section}{\numberline {43}Changing Structures, Vectors, and Objects}{619} \contentsline {subsection}{\numberline {43.1}More Practice with Vectors}{619} \contentsline {subsection}{\numberline {43.2}Collections of Structures with Cycles}{638} \contentsline {subsection}{\numberline {43.3}Backtracking with State}{649} \contentsline {part}{Epilogue}{653} \contentsline {subsection}{Computing}{653} \contentsline {subsection}{Programming}{654} \contentsline {subsection}{Moving On}{655}