Structure And Interpretation Of Computer Programs

Structure And Interpretation Of Computer Programs

A classic. Recommended book found in TYCS.

For updates see: SICP_logs

1 Building Abstractions With Procedures

1.1 Elements of Programming

Some fundamental keywords, as they relate to scheme.

Procedures, combinations, special forms, etc.

Case study: Square Roots by Newton's method. The point here is to start with a mathematical definition, then turn it into a structure of procedures.

1.2 Procedures and Processes

Linear recursion and iteration.

Tree recursion: process evolution looks like a tree.

Orders of growth (space vs time).

Case studies such as: exponentiation and GCD. Explore linear recursive vs iterative processes, and analyze growth.

1.3 Formulating abstractions with higher-order procedures

Introducing things like let, lambda, etc.

They make a parallel between higher-order functions and the sigma notation in Mathematics. Some sequences are explored.

Various sequences are explored: sum of cubes, pi/8 sum, sum of integers (using identity function).

Case study: finding roots of equations using half-interval method.

2 Building Abstractions With Data

2.1 Introduction to Data Abstraction

Introduces the idea of compound data objects. Uses rational number type as an initial example. Abstraction barriers. cons, car, and cdr get re-implemented in scheme (wow!).

2.2 Hierarchical Data and the Closure Property

The sequence, and how they are represented in Scheme as cons's (aka a linked list). Introduction to list operations. Mapping over lists. Hierarchical structures (aka Trees). Mapping over trees. Sequence operations (like how a DSP engineer would think). "Picture language" used as a visual way to synthesize complex operations from a core set of primitives using high-order operations.

2.3 Symbolic Data

The quote operator. Symbolic algebra. Abstract data. Implementations of Binary trees. Huffman encoding and huffman trees.

2.4 Multiple Representations for Abstract Data

Example used: complex numbers, and how they can be represented differently (this may be in 2.5?) (this may be in 2.5?). Builds up abstractions for how to manage complex number operations. Dispatching on Type. Generic interfaces. Data-directed programming.

2.5 Systems with Generic Operations

More on generic systems using compelx numbers as example. Hierarchies of types. Inadequacies of hierarchies.

I "super-skimmed" 2.5.3 section on symbolic algebra, as it was very math-oriented and not really interesting to me.

3 Modularity, Objects, and State

3.1 Assignment and Local State

Introducing set! using a bank acount withdraw as an example. Using local state to make different instances of withdraw. Building a stateful RNG and using it in monte-carlo simulations (showcasing how it simplifies code). Downfalls of assignment/state: can not use substitution like previous chapters. Programming without assignment: functional programming. Samness.

3.2 The Environment Model of Evaluation

Variables as "places" instead of values. Analysis of Environments used in simple procedures like square and sum-of-squares. Analysis of make-withdraw. Internal defitions in environments. Sharing and identity. Mutation=assignment.

3.3 Modeling with Mutable Data

Queues. Tables: one and two dimensions. Local tables with separate lookup and insert for each table. Digital circuit simulator implementation: logic, wires, agenda, constraints.

3.4 Concurrency: Time is of the Essence


3.5 Streams


4 Metalinguistic Abstraction

4.1 The metacircular environment


4.2 Variations on a Scheme -- Lazy Evaluation


4.3 Variations on a Scheme -- Nondeterministic Computing


4.4 Logic Programming


5 Computing with Register Machines

5.1 Designing Register Machines


5.2 A Register-Machine Simulator


5.3 Storage Allocation and Garbage Collection


5.4 The Explict-Control Evaluator


5.5 Compilation