CS 37: Structure and Interpretation of Computer Programs

Announcements | Schedule | Grading | Labs | Integrity | Links


This course will emphasize abstraction techniques necessary for designing large and complex programs.

Instead of more a common language like C, Java, or Python, we will be using a dialect of Lisp called Scheme. Scheme allows programming abstractions to be constructed more simply than is possible in a language like C. This power will let us deal with core computer science concepts without focusing on idiosyncratic syntactic details of the language.

The topics we will cover in this class include functional programming, recursion, data abstraction, higher-order functions, lists, trees, and sets, object-oriented programming, binding and scope. The course culminates in the development and implemention of an interpreter, written in Scheme, which will cover a large subset of the Scheme language itself.

This course assumes completion of CPSC 035.

Class information

Room: Science Center 240
Class Time: MWF 9:30 am – 10:30 am
Lab Time: M 2:40 pm – 4:10 pm
Text: Abelson, Sussman and Sussman, Structure and Interpretation of Computer Programs, 2nd edition. (Available for purchase, or in its entirety online)

Professor: Richard Wicentowski
Office: Science Center 251
Phone: (610) 690-5643
Office hours: Thursday 10:30 am – noon, and by appointment


Lab 1 is due Sunday night at midnight.


In the schedule below, the reading listed next to each day is the reading that we will be discussing in class on that day, not that night's reading assignment. You must come to class having already done the reading listed next to each day.

1 Jan 16   Basic Scheme / Lists
Section 1.1
Exercise 1.1
Jan 18  
Jan 20  
2 Jan 23   Recursion and Iteration
Section 1.2 - 1.2.2
Jan 25  
Jan 27 Last Day to Add/Drop
3 Jan 30   Abstractions with Higher Order Procedures
Section 1.3
Feb 01  
Feb 03  
4 Feb 06   Data Abstraction (Section 2.1)
Hierarchical Data (Section 2.2)
Sets and Trees (Section 2.3)
Feb 08  
Feb 10  
5 Feb 13  
Data Representations (Section 2.4)
Feb 15  

Feb 17

Exam 1

6 Feb 20   Object Oriented Programming
Chapter 3 Introduction & Section 3.1
Feb 22  
Feb 24  
7 Feb 27   Mutable Data
Section 3.3
Feb 29  
Mar 02   No class (finish lab #5)

Mar 05

Spring Break

Mar 07

Mar 09

8 Mar 12   Streams
Section 3.5
Mar 14  
Mar 16  
9 Mar 19   F#
F# Language Reference
F# Programming (Wikibooks)
OCaml reference book (Ch 2)
Principles of Programming Languages (S. Smith)
Mar 21  
Mar 23  
10 Mar 26   #8
Mar 28  
Mar 30  
11 Apr 02    
Apr 04    

Apr 06

Exam 2

12 Apr 09   Interpreter Project
Section 4.1
Part 1
Apr 11   Part 2
Extn A
Apr 13  
13 Apr 16   Part 3
Apr 18   Part 4
Extn B
Apr 20  
14 Apr 23   Part 5
Apr 25   Part 6
Extn C
Apr 27  


Grades will be weighted as follows:

20%Final Project
5%Class Pariticipation and Attendance

Lab Policy

Lab assignments will typically be assigned in lab on Monday and be due the following Sunday evening at midnight. You are strongly encouraged to start early and ask questions early if you get stuck. Some labs may take a considerable amount of time, so you should begin working on assignments well before the due date.

Most of the lab assignments will use the Racket programming language. You can download Racket for Mac, Windows, or Linux.

You are encouraged to work with a partner on all labs. You can work with a different partner each week except during the interpreter project when you must work with the same partner for 3 consecutive weeks.

Because we will discuss the solutions to lab assignments in class, late assignments will not normally be accepted; however, special exceptions can be made if you contact me well in advance of the deadline. Even if you do not fully complete an assignment, you should submit what you have done to receive partial credit.

You will submit you assignments electronically using the handin37 program. You may submit your assignment multiple times, but each submission overwrites the previous one and only the final submission will be graded.

Academic Integrity

Academic honesty is required in all work you submit to be graded. With the exception of your partner on lab assignments, you may not submit work done with (or by) someone else, or examine or use work done by others to complete your own work.

You may discuss lab specifications and requirements with others in the class to be sure you understand the problem. In addition, you are allowed to work with others to help learn the course material. However, with the exception of your lab partner, you may not work with others on your lab assignments in any capacity.

All code you submit must be your own with the following permissible exceptions: code distributed by me as part of the class, code found in the course text book, and code worked on with your lab partner. You should always include detailed comments that indicates which parts of the lab you received help on, and what your sources were.

Please see me if there are any questions about what is permissible.

Below are some external links which may be helpful to you.

How to Design Programs by Felleisen, Findler, Flatt and Krishnamurthi
Concrete Abstractions by Hailperin, Kaiser and Knight
The Scheme Programming Language by Dybvig
xkcd #224, #297 and #312 (humorous, not helpful)