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.

The course consists of lectures, laboratory exercises and homeworks.