Sandeep Neupane, you can contact him via Canvas

Please complete the following:

A comprehensive programming language course, with emphasis on programming paradigms and language processors - and some of their formal models like Predicate Logic and Lambda Calculus. Hands-on work with implementations of key concepts (recursion, inheritance, unification, backtracking, type inference, infinite and lazy data objects, threads. The course also provides a glimpse at salient features of modern object oriented languages and an overview of language implementation techniques, run-time systems and memory management in an efficient procedural language.

- From Turing machines and Lambda calculus to today's programming languages
- Programming Paradigms: logic, functional, object oriented, imperative
- Language Processors: Interpreters and Virtual Machines, Compilers

- Intro to Untyped Functional Programming with Python
- Finite functions: dictionaries, arrays, sets
- List and set comprehensions
- Coroutining with
*yield* - Programming with Recursive Functions and Lists
- Higher Order Functions
- Intro to Types and Functional Programming with Haskell
- Working with Fold, Map, Zip
- Polymorphism, Type inference
- Recursive Data Types and Pattern Matching in Haskell
- Monads and IO in Haskell
- Lazy Evaluation, Computing with Infinite Lists
- Lambda Calculus, De Bruijn Indices
- Simply-typed Lambda Terms, Type Checking vs. Inference
- The propositions-as-types correspondence
- Evaluation of Lambda Terms, Normalization

- Intro to Prolog: Facts and Rules, Recursion, Lists and Compound Terms, Arithmetic
- Propositional and Predicate logic, Classical and Intuitionistic
- Unification and Horn Clause Resolution in Prolog
- Non-determinism and Backtracking with Prolog and Python
- Case study: solving cryptarithmetic puzzles with Prolog and Python
- Definite Clause Grammars, Parsing and Generation
- Problem solving with Prolog
- Runtime Code Generation: the dynamic database
- Higher order Predicates and Meta-interpreters
- Generating Lambda Terms in Prolog and Python
- Type inference for simply-typed Lambda Terms in Prolog and Python

- Classes and Objects in Python 3
- Overview of Java 10
- Static vs. Dynamic Aspects
- Classes, Instances, Objects, Interfaces
- Collections, Streams, Lambdas, Iterators and IO operations
- Reflection and Serialization

- Basics: assignment, function calls,, lexical scoping, memory representations, stack and heap
- Implementing dynamic memory management and garbage collection
- Implementing high-level programming languages in C

- Event driven programming, Coroutining, Futures, Multi-threading
- Distributed Programming, Message Passing, Coordination

- Tucker & Noonan: Programming Languages, Principles and Paradigms, McGraw Hill
- The Art of Prolog by Sterling and Shapiro, MIT Press
- Doets & van Eijck: The Haskell Road to Logic, Math and Programming
- Harper’s draft PL book
- Java for Students: Douglas Bell & Mike Parr, Prentice Hall

- 2 Individual Exams: 30%+30%
- Individual Assignments: 40%

- Python 3 tutorial
- Functional Python 3 also, a good blog on it
- Python 3 generators and list-comprehensions
- Python 3 itertools library
- SWI Prolog
- A good prolog tutorial.
- Haskell compiler GHC
- Haskell tutorials. Also, a very good one here. On Haskell Functors and Monads this and this. On IO and imperative constructs.
- Java interpreter/compiler JDK
### Outcomes:

- Understand foundational concepts of programming languages, with emphasis on programming paradigms and language processors.
- Have a practical understanding of commonalities and differences between major programming paradigms.
- Understand key object oriented, logic and functional programming concepts.
- Understand key concepts of event driven and concurrent programming.
- Understand the use and implementation of modern programming language concepts like recursion, inheritance, reflection, unification, backtracking, type inference, infinite data objects and threads.