Part 1 Building abstractions with procedures: the elements of programming; expressions; naming and the environment; evaluating combinations; compound procedures; the substitution model for procedure application; conditional expressions and predicates; example: square roots by Newton's method; procedures as black-box abstractions; procedure and the processes they generate; linear recursion and iteration; tree recursion; orders of growth; exponentiation; greatest common divisors; example: testing primality; formulating abstractions with higher-order procedures; procedures as arguments; constructing procedures using Lambda; procedures as general methods; procedures as returned values. Part 2 Building abstractions with data: introduction to data abstraction; example: arithmetic operations for rational numbers; abstraction barriers; what is meant by data? extended exercise: interval arithmetic; hierarchical data and the closure property; representing sequences; hierarchical structures; sequences as conventional interfaces; example: a picture language; symbolic data; quotation; example: symbolic differentiation; example: representing sets; example: Huffman encoding trees; multiple representations for abstract data; representations for complex numbers; tagged data; data-directed programming and additivity; systems with generic operations; generic arithmetic operations; combining data of different types; example: symbolic algebra. Part 3 Modularity, objects, and state: assignment and local state; local state variables; the benefits of introducing assignment; the costs of introducing assignment; the environment model of evaluation; the rules for evaluation; applying simple procedures; frames as the repository of local state; internal definitions; modelling with mutable data; mutable list structure; representing queues; representing tables; a simulator for digital circuits; propagation of constraints; concurrency: time is of the essence; the nature of time in concurrent systems; mechanisms for controlling concurrency; streams; streams are delayed lists; infinite streams; exploiting the stream paradigm; streams and delayed evaluation; modularity of functional programs and modularity of objects. Part 4 Metalinguistic abstraction: the metacircular evaluator; the core of the evaluator; representing expressions; evaluator data structures; running the evaluator as a program; data as programs; internal definitions; separating syntactic analysis from execution; variations on a scheme - lazy evaluation; normal order and applicative order; an interpreter with lazy evaluation; streams as lazy lists. (Part contents).