The second course in the introductory sequence for Computer Science
majors at Willamette. As a second course in programming, it deepens
and enriches a student's understanding of the basic processes involved in
computing. But it also begins to focus on deeper and more abiding issues
such as evaluating design strategies and implementation effectiveness.

An intermediate-level course covering the main concepts of programming
languages, including history, components (syntax, semantics, pragmatics), formal
treatments, design issues and exposure to a handful of languages in lab.
Since Willamette has not been regularly teaching a compilers course recently,
I incorporated some material from this topic in the most recent offering.

An upper-level course on the theory of computation. Despite the course
title (which is traditional at Willamette), we actually consider
computation from the perspectives of both abstract machines (automata)
and language formalisms (the Chomsky hierarchy).

An upper-level course on functional programming taught in Haskell.
In addition to the usual techniques of functional programming
(algebraic data structures, higher-order functions, polymorphism and
lazy evaluation), this version of the course stresses the use of
generic folds and other generic functions in program design (currently
these techniques are not supported by specific language features).

An earlier version of this course (Fall 1997) was taught bi-lingually
in Scheme and Haskell, but I felt that the overhead associated with
learning two languages detracted from the goals of the course as a whole.