Грядёт курс по функциональному программированию на OCaml, который заставит всех вспомнить, что вам рассказывали на первом курсе, а также забыть то, как вас учили программировать (шутка).

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

1) Читать какую-нибудь литературу про функциональное программирование. Например, отличную книжку Real World OCaml. Во 2м издании поменялись команды правильной компиляции исходников, поэтому стоит читать его, не смотря на то, что 1е издание было переведено на русский.

Также есть книжка от университета Cornell c видео на английском.

2) Вопросы можно задачать

3) Постараться освоить инфраструктуру заранее, до серьёзной работы над доманим заданием. А именно

  • установить пакетный менеджер opam и OCaml через него; на GNU/Linux и MacOS это будет проще, под Windows скорее всего надо разобраться с WSL2.
  • разобраться как компилировать шаблон домашки (будет выложен позже) с помощью системы сборки dune, как подключать дополнительные пакеты так, чтобы они могли использоваться
  • установить VsCode и плагин для него; убедиться, что работает Go-to-definition, autocomplete и подсветка ошибок, и для стандартной библиотеки OCaml, и для кода, подключенного с помощью dune. Убедиться, что работает автоматическое форматирование кода с помощью ocamlformat
  • Вспомнить что вам рассказывали на первом курсе про Continious Integration

4) Попробовать закодить (на произвольном языке программирования) следующую задачу. Сделать интепретатор (вычислитель) арифметических выражений, которые состоят из переменных, констант и бинарных операций (сложение, умножение и т.п.). В интепретатор также передается “окружение”, откуда можно доставать по имени значения переменных. Интерпретатор нужно уметь модифицировать (желательно без копипасты) одной или несколькими дополнительными “фичами”, конкретный набор которых определяется программистом:

  • Поддержка ошибок (переменная без значения, деление на ноль и т.п.). Интепретатор должен завершаться с вердиктом “случилась какая-то ошибка” или “случилась вот эта конкретная ошибка” вместо падения программы посередине интерпретации
  • Неоднозначные вычисления: у переменных может быть больше одного значения, в этом случае выражение должно посчитаться всеми возможными способами.
  • Доступ к окружению может быть произвольно долгим (например, запрос на какой-то сайт). В этом случае желательно, чтобы интепретатор повешивал программу, а делал запрос, должидался ответа, и потом продолжал считать выражение с уже известным значением переменной.
  • Учитывая, что структура выражений древовидная, скорее всего у вас будет вложенная рекурсия, которая на больших деревьях может привести к переполнению стека. Проверьте, есть ли в вашей реализации этот недостаток, и если есть, то попробуйте это исправить