CS 37: Structure and Interpretation of Computer Programs

Spring 2013

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 Racket. Racket 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 Racket, which will cover a large subset of the Racket language itself.

This course assumes completion of CPSC 035.

Class information

Room: Science Center 256
Class Time: TR 9:55 am – 11:10 am
Lab Times: M 1:00pm – 2:30pm or M 2:40pm – 4:10pm
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: Tuesday 1:00pm – 4:00pm, and by appointment


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 22   Basic Racket / Lists
Section 1.1
Exercise 1.1
Jan 24  
2 Jan 29   Recursion and Iteration
Section 1.2 - 1.2.2
Jan 31 Drop/Add ends (Feb 01) Abstractions with Higher Order Procedures
Section 1.3
3 Feb 05   #3
Feb 07   Data Abstraction (Section 2.1)
Hierarchical Data (Section 2.2)
Sets and Trees (Section 2.3)
4 Feb 12   #4
Feb 14  
Data Representations (Section 2.4)
5 Feb 19   Object Oriented Programming
Chapter 3 Introduction & Section 3.1

Feb 21

Exam 1

6 Feb 26   Mutable Data
Section 3.3
Feb 28  
7 Mar 05   Streams
Section 3.5
Mar 07  

Mar 12

Spring Break

Mar 14

8 Mar 19   Haskell
Learn You a Haskell for Great Good!
Real World Haskell
Haskell on wikibooks

Principles of Programming Languages
Book website
Mar 21  
9 Mar 26   #8
Mar 28 Last day to declare CR/NC or W (Mar 29)
10 Apr 02   #9
Apr 04  
11 Apr 09  

Apr 11

Exam 2

12 Apr 16   Interpreter Project
Section 4.1
Part 1
Apr 18   Part 2
Extension A
13 Apr 23   Part 3
Apr 25   Part 4
Extension B
14 Apr 30   Part 5
May 02   Part 6
Extension C


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, #1270 and #312 (humorous, not helpful)