{"publishers": ["MIT Press", "McGraw-Hill"], "identifiers": {"librarything": ["13008"], "goodreads": ["1394820", "777411"]}, "table_of_contents": [{"level": 0, "label": "Foreword", "title": "Foreword", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "Preface", "title": "Preface to the First Edition", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "Preface", "title": "Preface to the Second Edition", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "Acknowledgements", "title": "Acknowledgements", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1", "title": "Building Abstractions with Procedures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1", "title": "The Elements of Programming", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.1", "title": "Expressions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.2", "title": "Naming and the Environment", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.3", "title": "Evaluating Combinations", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.4", "title": "Compound Procedures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.5", "title": "The Substitution Model for Procedure Application", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.6", "title": "Conditional Expressions and Predicates", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.7", "title": "Example: Square Roots by Newton's Method", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.1.8", "title": "Procedures as Black Box Abstractions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2", "title": "Procedures and the Processes They Create", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2.1", "title": "Linear Recursion and Iteration", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2.2", "title": "Tree Recursion", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2.3", "title": "Orders of Growth", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2.4", "title": "Exponentiation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2.5", "title": "Greatest Common Divisors", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.2.6", "title": "Example: Testing for Primality", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.3", "title": "Formulating Abstractions with Higher-Order Procedures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.3.1", "title": "Procedures as Arguments", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.3.2", "title": "Constructing Procedures Using Lambda", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.3.3", "title": "Procedures as General Methods", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "1.3.4", "title": "Procedures as Returned Values", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2", "title": "Building Abstractions with Data", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.1", "title": "Introduction to Data Abstraction", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.1.1", "title": "Example: Arithmetic Operations for Rational Numbers", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.1.2", "title": "Abstraction Barriers", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.1.3", "title": "What Is Meant By Data?", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.1.4", "title": "Extended Exercise: Interval Arithmetic", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.2", "title": "Hierarchical Data and the Closure Property", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.2.1", "title": "Representing Sequences", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.2.2", "title": "Hierarchical Structures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.2.3", "title": "Sequences as Conventional Interfaces", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.2.4", "title": "Example: A Picture Language", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.3", "title": "Symbolic Data", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.3.1", "title": "Quotation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.3.2", "title": "Example: Symbolic Differentiation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.3.3", "title": "Example: Representing Sets", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.3.4", "title": "Example: Huffman Encoding Trees", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.4", "title": "Multiple Representations for Abstract Data", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.4.1", "title": "Representations for Complex Numbers", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.4.2", "title": "Tagged data", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.4.3", "title": "Data-Directed Programming and Additivity", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.5", "title": "Systems with Generic Operations", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.5.1", "title": "Generic Arithmetic Operations", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.5.2", "title": "Combining Data of Different Types", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "2.5.3", "title": "Example: Symbolic Algebra", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3", "title": "Modularity, Objects, and State", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.1", "title": "Assignment and Local State", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.1.1", "title": "Local State Variables", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.1.2", "title": "The Benefits of Introducing Assigment", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.1.3", "title": "The Costs of Introducing Assignment", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.2", "title": "The Environment Model of Evaluation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.2.1", "title": "The Rules for Evaluation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.2.2", "title": "Applying Simple Procedures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.2.3", "title": "Frames as the Repository of Local State", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.2.4", "title": "Internal Definitions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.3", "title": "Modeling with Mutable Data", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.3.1", "title": "Mutable List Structures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.3.2", "title": "Representing Queues", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.3.3", "title": "Representing Tables", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.3.4", "title": "A Simulator for Digital Circuits", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.3.5", "title": "Propogation of Constraints", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.4", "title": "Concurrency: Time Is of the Essence", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.4.1", "title": "The Nature of Time in Concurrent Systems", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.4.2", "title": "Mechanisms for Controlling Concurrency", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.5", "title": "Streams", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.5.1", "title": "Streams Are Delayed Lists", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.5.2", "title": "Infinite Streams", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.5.3", "title": "Exploiting the Stream Paradigm", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.5.4", "title": "Streams and Delayed Evaluation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "3.5.5", "title": "Modularity of Functional Programs and Modularity of Objects", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4", "title": "Metalinguistic Abstraction", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1", "title": "The Metacircular Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.1", "title": "The Core of the Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.2", "title": "Representing Expressions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.3", "title": "Evaluator Data Structures", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.4", "title": "Running the Evaluator as a Program", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.5", "title": "Data as Programs", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.6", "title": "Internal Definitions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.1.7", "title": "Separating Syntactic Analysis from Execution", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.2", "title": "Variations on a Scheme\u2014Lazy Evaluation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.2.1", "title": "normal Order and Applicative Order", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.2.2", "title": "An Interpreter with Lazy Evaluation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.2.3", "title": "Streams as Lazy Lists", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.3", "title": "Variations on a Scheme\u2014Nondeterministic Computing", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.3.1", "title": "Amb and Search", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.3.2", "title": "Examples of Nondeterministic Programs", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.3.3", "title": "Implementing the Amb Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.4", "title": "Logic Programming", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.4.1", "title": "Deductive Information Retrieval", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.4.2", "title": "How the Query System Works", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.4.3", "title": "Is Logic Programming Mathematical Logic?", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "4.4.4", "title": "Implementing the Query System", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5", "title": "Computing with Register Machines", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.1", "title": "Designing Register Machines", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.1.1", "title": "A Language for Describing Register Machines", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.1.2", "title": "Abstraction in Machine Design", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.1.3", "title": "Subroutines", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.1.4", "title": "Using a Stack to Implement Recursion", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.1.5", "title": "Instruction Summary", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.2", "title": "A Register-Machine Simulator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.2.1", "title": "The Machine Model", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.2.2", "title": "The Assembler", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.2.3", "title": "Generating Execution Procedures for Instructions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.2.4", "title": "Monitoring Machine Performance", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.3", "title": "Storage Allocation and Garbage Collection", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.3.1", "title": "Memory as Vectors", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.3.2", "title": "Maintaining the Illusion of Infinite Memory", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.4", "title": "The Explicit-Control Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.4.1", "title": "The Core of the Explicit-Control Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.4.2", "title": "Sequence Evaluation and Tail Recursion", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.4.3", "title": "Conditionals, Assignments, and Definitions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.4.4", "title": "Running the Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5", "title": "Compilation", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.1", "title": "Structure of the Compiler", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.2", "title": "Compiling Expressions", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.3", "title": "Compiling Combinations", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.4", "title": "Combining Instruction Sequences", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.5", "title": "An Example of Compiled Code", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.6", "title": "Lexical Addressing", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "5.5.7", "title": "Interfacing Compiled Code to the Evaluator", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "References", "title": "References", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "List of Exercises", "title": "List of Exercises", "type": {"key": "/type/toc_item"}}, {"level": 0, "label": "Index", "title": "Index", "type": {"key": "/type/toc_item"}}], "isbn_10": ["0262011530", "0070004846"], "dewey_decimal_class": ["005.13/3"], "covers": [149338, 53178], "lc_classifications": ["QA76.6 .A255 1996"], "key": "/books/OL980232M", "authors": [{"key": "/authors/OL532838A"}], "publish_places": ["Cambridge, Mass", "New York"], "contributions": ["Sussman, Gerald Jay.", "Sussman, Julie."], "uri_descriptions": ["Publisher description", "Table of contents"], "languages": [{"key": "/languages/eng"}], "pagination": "xxviii, 855p.", "classifications": {}, "source_records": ["ia:structureinterpr00abel_595", "ia:pdfy-x0q2Q4K6h-gsWbes"], "title": "Structure and interpretation of computer programs, second edition", "url": ["http://www.loc.gov/catdir/description/mh022/96017756.html", "http://www.loc.gov/catdir/toc/mh022/96017756.html"], "notes": {"type": "/type/text", "value": "This edition emphasizes several new themes. The most important of these is the central role played by different approaches to dealing with time in computational models: objects with state, concurrent programming, functional programming, lazy evaluation, and nondeterministic programming. Includes new sections on concurrency and nondeterminism."}, "number_of_pages": 883, "edition_name": "Second Edition", "lccn": ["96017756"], "subjects": ["Computer programming.", "LISP (Computer program language)"], "publish_date": "1996", "publish_country": "mau", "copyright_date": "\u00a91996 by The Massachusetts Institute of Technology", "by_statement": "Harold Abelson and Gerald Jay Sussman, with Julie Sussman ; foreword by Alan J. Perlis.", "works": [{"key": "/works/OL3267304W"}], "type": {"key": "/type/edition"}, "uris": ["http://www.loc.gov/catdir/description/mh022/96017756.html", "http://www.loc.gov/catdir/toc/mh022/96017756.html", "http://mitpress.mit.edu/sicp/"], "latest_revision": 28, "revision": 28, "created": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "last_modified": {"type": "/type/datetime", "value": "2025-04-21T17:06:04.279934"}}