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
TBD.
3.5 Streams
TBD.
4 Metalinguistic Abstraction
4.1 The metacircular environment
TBD.
4.2 Variations on a Scheme -- Lazy Evaluation
TBD.
4.3 Variations on a Scheme -- Nondeterministic Computing
TBD.
4.4 Logic Programming
TBD.
5 Computing with Register Machines
5.1 Designing Register Machines
TBD.
5.2 A Register-Machine Simulator
TBD.
5.3 Storage Allocation and Garbage Collection
TBD.
5.4 The Explict-Control Evaluator
TBD.
5.5 Compilation
TBD.