[{"id":0,"hasCaret":false,"label":"Foreword to Structure and Interpretation of Computer Programs, 1984","nodeData":"foreword84"},{"id":1,"hasCaret":false,"label":"Prefaces to Structure and Interpretation of Computer Programs, 19961984","nodeData":"prefaces96"},{"id":3,"hasCaret":true,"label":"1 Building Abstractions with Functions","nodeData":"1","childNodes":[{"id":4,"hasCaret":true,"label":"1.1 The Elements of Programming","nodeData":"1.1","childNodes":[{"id":5,"hasCaret":false,"label":"1.1.1 Expressions","nodeData":"1.1.1"},{"id":6,"hasCaret":false,"label":"1.1.2 Naming and the Environment","nodeData":"1.1.2"},{"id":7,"hasCaret":false,"label":"1.1.3 Evaluating Operator Combinations","nodeData":"1.1.3"},{"id":8,"hasCaret":false,"label":"1.1.4 Compound Functions","nodeData":"1.1.4"},{"id":9,"hasCaret":false,"label":"1.1.5 The Substitution Model for Function Application","nodeData":"1.1.5"},{"id":10,"hasCaret":false,"label":"1.1.6 Conditional Expressions and Predicates","nodeData":"1.1.6"},{"id":11,"hasCaret":false,"label":"1.1.7 Example: Square Roots by Newton's Method","nodeData":"1.1.7"},{"id":12,"hasCaret":false,"label":"1.1.8 Functions as Black-Box Abstractions","nodeData":"1.1.8"}]},{"id":13,"hasCaret":true,"label":"1.2 Functions and the Processes They Generate","nodeData":"1.2","childNodes":[{"id":14,"hasCaret":false,"label":"1.2.1 Linear Recursion and Iteration","nodeData":"1.2.1"},{"id":15,"hasCaret":false,"label":"1.2.2 Tree Recursion","nodeData":"1.2.2"},{"id":16,"hasCaret":false,"label":"1.2.3 Orders of Growth","nodeData":"1.2.3"},{"id":17,"hasCaret":false,"label":"1.2.4 Exponentiation","nodeData":"1.2.4"},{"id":18,"hasCaret":false,"label":"1.2.5 Greatest Common Divisors","nodeData":"1.2.5"},{"id":19,"hasCaret":false,"label":"1.2.6 Example: Testing for Primality","nodeData":"1.2.6"}]},{"id":20,"hasCaret":true,"label":"1.3 Formulating Abstractions with Higher-Order Functions","nodeData":"1.3","childNodes":[{"id":21,"hasCaret":false,"label":"1.3.1 Functions as Arguments","nodeData":"1.3.1"},{"id":22,"hasCaret":false,"label":"1.3.2 Constructing Functions using Lambda Expressions","nodeData":"1.3.2"},{"id":23,"hasCaret":false,"label":"1.3.3 Functions as General Methods","nodeData":"1.3.3"},{"id":24,"hasCaret":false,"label":"1.3.4 Functions as Returned Values","nodeData":"1.3.4"}]}]},{"id":25,"hasCaret":true,"label":"2 Building Abstractions with Data","nodeData":"2","childNodes":[{"id":26,"hasCaret":true,"label":"2.1 Introduction to Data Abstraction","nodeData":"2.1","childNodes":[{"id":27,"hasCaret":false,"label":"2.1.1 Example: Arithmetic Operations for Rational Numbers","nodeData":"2.1.1"},{"id":28,"hasCaret":false,"label":"2.1.2 Abstraction Barriers","nodeData":"2.1.2"},{"id":29,"hasCaret":false,"label":"2.1.3 What Is Meant by Data?","nodeData":"2.1.3"},{"id":30,"hasCaret":false,"label":"2.1.4 Extended Exercise: Interval Arithmetic","nodeData":"2.1.4"}]},{"id":31,"hasCaret":true,"label":"2.2 Hierarchical Data and the Closure Property","nodeData":"2.2","childNodes":[{"id":32,"hasCaret":false,"label":"2.2.1 Representing Sequences","nodeData":"2.2.1"},{"id":33,"hasCaret":false,"label":"2.2.2 Hierarchical Structures","nodeData":"2.2.2"},{"id":34,"hasCaret":false,"label":"2.2.3 Sequences as Conventional Interfaces","nodeData":"2.2.3"},{"id":35,"hasCaret":false,"label":"2.2.4 Example: A Picture Language","nodeData":"2.2.4"}]},{"id":36,"hasCaret":true,"label":"2.3 Symbolic Data","nodeData":"2.3","childNodes":[{"id":37,"hasCaret":false,"label":"2.3.1 Strings","nodeData":"2.3.1"},{"id":38,"hasCaret":false,"label":"2.3.2 Example: Symbolic Differentiation","nodeData":"2.3.2"},{"id":39,"hasCaret":false,"label":"2.3.3 Example: Representing Sets","nodeData":"2.3.3"},{"id":40,"hasCaret":false,"label":"2.3.4 Example: Huffman Encoding Trees","nodeData":"2.3.4"}]},{"id":41,"hasCaret":true,"label":"2.4 Multiple Representations for Abstract Data","nodeData":"2.4","childNodes":[{"id":42,"hasCaret":false,"label":"2.4.1 Representations for Complex Numbers","nodeData":"2.4.1"},{"id":43,"hasCaret":false,"label":"2.4.2 Tagged data","nodeData":"2.4.2"},{"id":44,"hasCaret":false,"label":"2.4.3 Data-Directed Programming and Additivity","nodeData":"2.4.3"}]},{"id":45,"hasCaret":true,"label":"2.5 Systems with Generic Operations","nodeData":"2.5","childNodes":[{"id":46,"hasCaret":false,"label":"2.5.1 Generic Arithmetic Operations","nodeData":"2.5.1"},{"id":47,"hasCaret":false,"label":"2.5.2 Combining Data of Different Types","nodeData":"2.5.2"},{"id":48,"hasCaret":false,"label":"2.5.3 Example: Symbolic Algebra","nodeData":"2.5.3"}]}]},{"id":49,"hasCaret":false,"label":"References","nodeData":"references"},{"id":50,"hasCaret":false,"label":"Background","nodeData":"making-of"}]