Комментарии (20)
- Использование Datalog-подобных систем в разных контекстах: от CozoDB до CodeQL и от Rust до GPU-фреймворков.
- Обсуждение того, какие именно технологии используются в продакшене: от Datomic до CozoDB и от Soufflé до CodeQL.
- Разговор о том, какие технологии используются для запросов к данным: от SQL-подобных до Datalog-подобных.
- Обсуждение того, какие технологии используются для запросов к данным в контексте GPU: CUDA, HIP и SPIR-V.
Clojure's Solutions to the Expression Problem
Clojure и «проблема выражений»
- Проблема: добавлять новые типы данных и новые операции без перекомпиляции всего кода и без нарушения существующих вызовов.
- ООП-языки решают лишь половину: легко новый класс, трудно новый метод.
- Функциональные языки наоборот: легко новая функция, трудно новый вариант данных.
Как Clojure объединяет лучшее
-
Протоколы
- Описывают набор методов без привязки к типу.
- Реализуются для любого существующего класса поздно, «извне».
- Компилируются в обычный Java-интерфейс, быстрый вызов.
-
Мультиметоды
- Выбор реализации по произвольной функции-диспетчеру (тип, значение, метаданные).
- Позволяют «разрезать» иерархию по другим осям, не только по классу.
-
Records и types
defrecordсоздает неизменяемую структуру с заранее известными полями и автоматическим доступом по ключам как к карте.deftypeдаёт полный контроль, поля хранятся примитивно, без лишних обёрток.
-
reify
- «Анонимный класс» на Clojure: создаёт объект, реализующий нужные протоколы/интерфейсы, без отдельного файла.
Практический итог
- Новый тип →
defrecord/deftype+ реализация нужных протоколов. - Новая операция → добавляем метод в протокол и реализуем для всех существующих типов.
- Старый клиентский код не трогается, компиляция не требуется.
Комментарии (16)
- Протоколы в Clojure теперь умеют диспатчиться по метаданным, а не только по типу.
- Участники скучают по временам, когда посты о продуктивности были про REPL, функциональность, композабельность и иммутабельность.
- Поделились ссылкой на демонстрацию решения «expression problem» в Clojure.
- Люди недооценивают готовые решения вроде Datomic и вместо этого пишут свои костыли.
- Один из участников вспомнил, как в 2013–15 писал тесты на Clojure и расширял фреймворк для Selenium.
Poor man's bitemporal data system in SQLite and Clojure
Бюджетная битемпоральная система на SQLite + Clojure
Автор: Адитья Атхалье, 14–15 июля 2025
Цель: «бедняцкая» реализация половины битемпоральной СУБД, удовлетворяющая «десятому закону Хендерсона».
Идея
Смешать SQLite с идеями из бухгалтерии, Clojure, Datomic, XTDB, Rama и Local-First, чтобы хранить факты и время двух видов:
- valid-time — когда событие произошло в реальности.
- tx-time — когда мы это узнали и записали.
Мир фактов и времени
- Сущность = полная история её жизни.
- Факт может быть истинным или ложным; при столкновении фактов нужны правила приоритета.
- Наблюдение ≠ реальность: база фиксирует не саму реальность, а наши заметки о ней.
- Материализованная реальность зависит от того, кто спрашивает и «когда» он спрашивает.
Архитектура
- Две маленькие VM: одна работает, вторая — резерв.
- Дёшевые диски для хранилища временных данных.
- Clojure: пространства имён и неизменяемость как главные инструменты.
- Trade-off: сложно спроектировать, но легко строить, запускать, поддерживать и обучать.
Подход
- Храним каждое изменение как добавление нового факта (append-only).
- Используем SQLite как простой, надёжный движок.
- Через Clojure-обёртку реализуем:
- вставку с двойной временной меткой;
- «time-travel» запросы (
as-of valid-time,as-of tx-time).
- Ограничиваемся минимальной сложностью на уровне всей системы.
Итог
Получили «половину» битемпоральной СУБД: медленную, сырую, но дешёвую, понятную и пригодную для локального использования.
Комментарии (39)
- XTDB и другие битемпоральные СУБД хвалят за возможность запросов «как было на дату X»; примеры из жизни — P&L за март по данным на 4 апреля.
- Некоторые участники уже годами реализуют похожее вручную: PostgreSQL + tstzrange, append-only-логи, триггеры, EAV-модель.
- Критика: Clojure-сообщество «герметично», а сама идея «fetch-as-of» кажется многим неинтересной.
- В крупных аналитических СУБД (ClickHouse, DuckDB, BigQuery, Snowflake, Spanner) AsOf-джоины уже доступны «из коробки».
- Автор блога пришёл к выводу: хранить всё как append-only-лог фактов и не плодить «две системы» (основная БД + аудит).