The final exam will be cumulative: any question that could appear on the quizzes could also appear on the final. Any material covered in lecture or in the book can be on the final: Material covered in lecture that is not in the book includes use of types to describe functions, use of contracts to describe data structures, OO programming, dynamic versus lexical scope, more on garbage collection than is covered in the book. Much of this material may be found in notes, slides, and code linked to the Schedule page. Reading covered: Chapter 1 excluding 1.2.6, Chapter 2 excluding 2.1.4, 2.3.3, 2.3.4, 2.5.3, Chapter 3 excluding 3.3.4, 3,3,5, 3.4, Chapter 4 excluding 4.1.6 and 4.4.4 (but including understanding of pattern matching and unification from 4.4.4), and 5.3.
The final is closed book, but tou may bring 3 sheets (both sides) of handwritten notes to the final. A previous semester's final that concentrated on the last part of the book can be found here: sample final with solutions. A set of review notes that gives more balanced coverage can be found here: Leventon's 1998 review notes. Ignore the material from pages 7, the top of 8, 9, and 10 of Leventon's notes.
Code for combined meta-circular evaluator, dynamic scope evaluator, non-memoizing lazy evaluator, and memoizing lazy evaluator.
Sample quiz not covering streams, with answers. Here is an additional problem based on a version of PS7 from a previous year.
Quiz 2 is closed book except for a single handwritten sheet of notes of (letter size, both sides).
Some topics to review: Anything covered previously in the semester, but the emphasis will be on the contents of Sections 2.3 - 2.5, 3.1 - 3.3, and 3.5 of the book and on problem sets 5 -- 8. Quote. Different forms of equality. Determining behavior of programs that use mutation. Performing generic operations by operation, by type, or by table of type and operation. Box and pointer diagrams involving list mutation. Environment diagrams Understanding OO programming. Some problems similar to those on problem sets 5 -- 8, which will be easier if you review the answer sheets for those problem sets! Creating streams, solving problems with streams, evaluating the effect of memoization on streams. (Be assured that you will have a question on environment diagrams, such a question might be to match a set of code fragments with a set of environment diagrams, or fill in the missing pieces of an environment diagram for a piece of code, or given an environment diagram fill in blanks in a piece of code so that the code would create the diagram.)
Some topics to review: The substitution model - both the detailed version, and the simplification that we used for looking at orders of growth. recursive vs iterative processes and orders of growth. The scope of variables and using nested defines to hide auxilliary procedures. Higher-order procedures: passing and retuning procedures; compose; using lambda to define anonymous procedures to pass to higher-order procedures. Data: pairs, '(), and lists. Box-and-pointer diagrams. Procedures on lists, procedures on trees. Composing a program using enumerate, map/filter, accumulate.
You should also look at the answer sheets on the homework page if you have not done so already.
To help you review: you can bring a single sheet (letter size, two sides) of hand-written notes to use on the quiz. You must write your own sheet and hand it in with the quiz. The quiz will be closed book other than for your sheet. Making this sheet should help you review.
Beating the Averages. Paul Graham on use of Lisp as a secret weapon in industry.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |