Principles of

Programming Languages

Upcoming deadlines


Course Number CIS 352 (Spring 2020) at Syracuse
Instructor Kristopher Micinski
Teaching Assistants Jack Vining (
Yihao Sun (
Times Tu/Th 11:00-12:20 Lecture Monday Labs
Professor Office Hours Th 9-11AM or by appt.
TA Office Hours (Mac Lab in LSC) Tu 9-11AM, 1-3PM. Th 2-4PM


The purpose of this course is to help you understand how to leverage the semantics programming languages to write the clearest and most obviously-correct programs you can. We will begin by introducing you to a new language, Racket. Racket is an untyped functional language that harmoniously mixes code and data to allow succinct and expressive programs. We will use Racket as a means to teach good functional programming style and reflect upon how our decisions impact the quality of our code. While doing this we will highlight several foundational concepts whose implications go far beyond Racket, such as operational semantics and the Lambda calculus.

After bringing students to fluency in functional programming, we will use Racket to build several different languages. The languages we build will be relatively small (compared to, say, C), but will be nonetheless expressive, allowing us to write quite impressive programs in languages we built ourselves. We will explore different ways of defining programming language semantics while remarking upon the implications of these choices in our day-to-day programming (even in languages beyond Racket, such as JavaScript, C++, Rust, etc…).

Course Structure

Please read the Syllabus for course information.