Автор двенадцать лет пилил Biff, а теперь решил разбить его на отдельные библиотеки. Первая из двенадцати готова — biff.core. Это клей для всех остальных частей, поэтому её и выпустили первой.
Раньше в Biff была структура «модули и компоненты». Каждое пространство имён в проекте отдавало карту модуля, потом куча шаблонного кода собирала из них одну системную карту, и эта карта пробрасывалась через функции-компоненты при старте. biff.core сохраняет эту структуру, но добавляет механизм, чтобы убрать шаблон.
Главная идея — «init functions». Это функции, которые принимают коллекцию модулей и возвращают одну карту, которую можно смержить в системную карту. Они хранятся в ключе :biff.core/init внутри карты модуля. Всё, что нужно разработчику — добавить модуль в проект, и init-функция сама делает сборку, без ручного копирования кусков кода в main.
Но возникла проблема. Раньше, когда вы вручную писали (def handler ...) в своём коде, работало late binding: меняешь модули — handler обновляется, и если в системной карте лежит var (со значением #'handler), то Ring обрабатывает новые запросы без перезапуска сервера. Когда эту логику вынесли в библиотеку, var пропал.
Решение получилось изящное: init-функции принимают не значение вектора модулей, а var этого вектора. А любые значения в системной карте, которые должны обновляться без перезапуска, становятся не простыми данными, а функциями (например, :com.example/get-my-thing вместо :com.example/my-thing). Эта функция разыменовывает var модулей, передаёт его в мемоизированную сборщицу и возвращает актуальный результат.
В итоге main-пространство имён остаётся чистым — только добавляешь модули и компоненты, и всё работает. Автор специально не стал усложнять: не ввёл ключи :biff.core/on-start и :biff.core/on-stop с зависимостями между жизненными циклами. Проще самому расположить компоненты в правильном порядке (стартовый проект Biff делает это за вас). Если проект настолько большой, что за всеми ресурсами не уследить — всегда можно накрутить сверху свой слой, который вычислит порядок компонентов.
P. S. Авторская команда ищет senior-инженера — в основном ClojureScript и Python, делают софт для моделирования проектов возобновляемой энергии.