Автор давно интересовался функциональным программированием, но Haskell казался слишком сложным. Про OCaml он был наслышан, но не пробовал — а зря. Сейчас язык переживает ренессанс: появились multicore, effects и новая системно-ориентированная ветка OxCaml от Jane Street. Автора заинтересовал Eio — фреймворк для конкурентности на основе effects. Главная фишка: он детерминированный, что упрощает тестирование.
Для начала автор взял Real World OCaml (RWO). Книга использует стандартную библиотеку Base от Jane Street — это нормально, потому что оригинальная стандартная библиотека OCaml была довольно скудной. Первая половина книги написана хорошо, но потом пошли GADT и first-class modules. Упражнений не хватало, поэтому автор переключился на курс CS3110 — там и видео, и текст, и задачи. Совет: начинать с CS3110, а потом браться за RWO.
Сам OCaml понравился: удачное сочетание функционального и императивного стиля. Можно писать рекурсивные функции с match, а можно использовать List.map и друзей. Есть и мутабельные переменные, если нужно. Синтаксис многословный (let … in, match … with), но автора это не смущает — именованные аргументы с ~ очень удобны. А вот компилятор раздражает: при первой же ошибке он бросает весь файл, итерация «написал — ошибка — фикс — пересборка» получается медленной.
Главная цель — написать Raft на Eio и протестировать его. Для разминки автор сделал простой RPC-клиент и сервер. Протокол примитивный: запрос состоит из id процедуры (1 байт), имени (байт длины + строка) и аргумента. Сервер циклически читает запросы из Flow, буферизированного через Buf_read/Buf_write, обрабатывает (Echo, Capitalise) и отправляет ответ.
Клиент сложнее: он безопасен для конкурентного использования. Два fiber'а: один пишет в сокет, другой читает. Писатель берёт задачи из Stream, добавляет promise в хеш-таблицу по request_id, а читатель разрешает promise, когда приходит ответ. Вызов invoke создаёт promise, кладёт запрос в очередь и ждёт ответа. Всё работает: автор проверил через nc и локальный запуск.
Итог: OCaml fun — легче, чем Haskell, но сообщество маленькое. Не всегда понятно, с чего начинать, и примеров кода мало. Eio напоминает Go. Автор планирует вернуться и доделать Raft.