Every programmer should gather insight into programming techniques that are different from the well-known procedural and object-oriented approaches. Lately, the functional programming paradigm is gaining popularity and allows decomposition of programs into independent functions, that can be executed in parallel.

In the Programming course we will study functional programming in programming languages ML and Racket. We will talk about: language typing, lexical and dynamic scopes, function closures, and also develop an interpreter for a custom programming language. Our goal will be to gain deeper understanding of  programming languages' and mastery of programming.

Prerequisites for taking this course are basic programming skills in procedural programming languages (such as Java, C++, Python) and understanding of recursion.

Coursework consists of weekly homework assignments, two seminars (the first one to be submitted in the middle of semester, the second one until the end of the semester) and a final exam.