Scheme

ОБЪЯВЛЕНИЯ


Расписание

Суббота, 19:00 - 20:00.

Воскресенье, 15:00 - 16:30.

Код с занятий

  • Суббота 10.04.21

  • Воскресенье, 11.04.21

Домашнее задание

  • Воскресенье, 11.04.21 (обсуждаем в субботу 17.04.21)

    • Видоизменить простую версию функции расчёта факториала - можно использовать известный вам матметод, можно разработать иную с точки зрения синтаксиса функцию

    • Написать функцию, которая принимает список и возвращает его последний элемент.

(last-el '(1 2 3 4 "string" 5))

----> 5

(last-el '(1 2 3 4 "string" '(3 2 1)))

----> (3 2 1)

  • * Написать функцию, которая принимает список из чисел и возвращает их сумму.

(sum '(1 2 3 4 5))

----> 15

Курсовые проекты

Альтернативный экзамен

Описание курса

О чем курс?

Данный курс посвящён функциональному языку программирования Scheme, и функциональному программированию (ФП) в целом. Цель курса - познакомить студентов с основными концепциями ФП, фундаментальными отличиями от императивного программирования. Язык Scheme служит отличной базой для этого, благодаря простоте своего синтаксиса и богатым возможностям.

Язык Scheme это минималистичный диалект LISP. В отличии от "чистых" функциональных языков, таких как Haskell, диалекты Лиспа допускает мультипарадигмальность - вместе с "чистым" функциональным кодом можно использовать "нечистый" код, с т.н. побочными эффектами. Это позволяет напрямую работать с вводом-выводом, с файлами, с сокетами/сетью и т.п.

Какой в этом смысл?

Понимание принципов ФП, владение функциональными языками, позволяет начать иначе смотреть на процесс вычисления/выполнения программ. Хороший программист, применяющий концепты ФП в разработке на не-функциональных языках, пишет чистый, понятный код, с минимальным числом непредсказуемых и неявных побочных эффектов. Такой код легко читать, очень легко отлаживать и исправлять.

Большинство современных языков программирования, которые применяются в индустрии, мультипарадигмные, и поддерживают различные элементы функционального программирования, такие как функции первого класса/высшего порядка (first class / higher order functions), лямбда-функции, безопасные по стеку рекурсии и т.д.

Как я смогу дальше это применить?

Как было сказано выше, навыки в ФП позволят вам писать ясный и четкий код, с минимальным числом побочных эффектов. Вы сможете осознанно использовать элементы ФП в современных языках (JavaScript, TypeScript, Scala, Python, Rust, C/C++, Java и многие другие).

Более того, некоторые диалекты Лиспа приобрели широкую популярность для решения индустриальных задач. Язык Clojure активно применяется для разработки веб-приложений (в списке литературы приведена отличная книга по современному Clojure от русскоязычного автора).

Требования к студентам

Никаких особых пререквизитов от студентов не требуется. Знакомство с любым императивным/мультипарадигным языком программирования (C/C++, Python, Java Script, etc) будет плюсом. Большое количество документации и книг по Scheme (а так же по другим функциональным ЯП, и в целом по программированию) существует только на английском языке, так что знание английского на среднем уровне будет полезно.

План занятий

Курс будет проходить в течении апреля 2021. Курс планируется кратким и интенсивным, и будет состоять из примерно 8-10 занятий / семинаров по два академических часа каждый.

Темы занятий

Привожу список тем, которые я собираюсь затронуть в течении курса, конкретное распределение их по занятиям будет ясно позже, когда установится расписание.

Язык программирования Scheme

  1. Базовые понятия и синтаксис. С-выражения, атомы, списки, типы данных. REPL, выполнение.

  2. Определение функций, суперпозиции функций. Функции как данные. Лямбда-функции.

  3. Рекурсия и условные выражения.

  4. Стандартные функции, внешние библиотеки. Работа со списками.

  5. "Нечистое" программирование и его место в программе. Ввод/вывод.

Функциональное программирование

  1. Основные отличия ФП от императивного программирования

  2. Функции высшего порядка (higher order functions), анонимные функции, функции как объекты

  3. Побочные эффекты (side effects). Чистые функции (pure functions), неизменяемые объекты (immutable objecta & immutability)

  4. Ленивые (нестрогие) и строгие вычисления

  5. Рекурсция в ФП, проблемы с переполнением стека и как они решаются

Процесс

Формат лекций/семинаров пока в разработке. Моей целью является сделать этот короткий курс вовлекающим и информативным, и при этом не сухим рассказом о синтаксисе со стандартными примерами.

Я постоянно проживаю за пределами России и могу вести этот курс только онлайн. Также формат занятий будет зависить от числа записавшихся на курс студентов - много интереса к языку Scheme это замечательно, но чем больше студентов, тем меньше интерактива я смогу самостоятельно организовать.

Note for the international students and those whose native language is not Russian. This course is offered primarily in Russian. However, I could give support and advice along the way in English. I understand that learning Russian and taking classes taught in Russian could be challenging, and I want to try and make this experience a little easier for you.

Литература

В этом списке представлены отличные книги и ресурсы на английском языке, посвящённые языку Scheme и некоторым его реализациям. В этом курсе мы будет фокусировать на стандартном GNU/MIT Scheme, но у языка есть ряд расширений, библиотек, например GNU Guile, которые позволяют разрабатывать разнообразные мощные приложения.

Эти ресурсы перечислены здесь, чтобы вам проще было идти через курс, искать документацию и дополнительную информацию, а так же чтобы продолжить путешествие в мир Scheme, LISP и функционального программирования. Все приведённые ссылки ведут на легально размещенные материалы, с соблюдением всех авторских прав, для целей образования.

Обширное, свежее и подробное издание Simply Scheme: Introducing Computer Science

Весьма короткая и простая к освоению книга Teach Yourself Scheme in Fixnum Days

Классическая книга по (функциональному) программированию Structure and Interpretation of Computer Programs, в которой в качестве основного языка используется Scheme. Также видео-лекции от авторов.

Подробное, качественное академическое издание The Scheme Programming Language

Один из развивающихся диалектов-расширений Scheme - CHICKEN. Помимо расширений (eggs) позволяет транислировать программы на Scheme в код на С и компилировать их в исполняемые файлы.

Clojure на производстве - замечательная книга от русскоязычного автора Игоря Гришаева. Clojure это современный диалект Lisp, активно использующийся в разработке веб-приложений и сервисов.

Библиотека расширений Scheme GNU Guile - позволяет создавать современные приложения для web, для декстопа, с GUI и консольным (в т.ч. псевдографическим) интерфейсами, библиотеки для решения большинства современных задач. GNU Guile так может быть использован как язык расширений для других приложений, благодаря развитым нативным интерфейсам (в обратную сторону, можно так же вызывать сторонний код из программ на GNU Guile).