Formatting code should be unnecessary 🔥 Горячее 💬 Длинная дискуссия
Форматирование кода должно быть лишним
В 80-х это уже знали.
Мой школьный учитель информатики, мистер Пейдж, участвовал в разработке компилятора Ada. Когда я в 2016-м жаловался на линтеры, он напомнил: проблему решили 40 лет назад. В Ada исходники не хранили — использовали IR-дерево DIANA. Каждый смотрел его в своём стиле: отступы, пробелы — всё равно.
Сейчас, в 2025-м, мы всё ещё спорим о запятых.
Как это работало
Рабочая станция Rational R1000 (1985) хранила не текст, а DIANA. IDE позволял редактировать дерево напрямую — проекционное редактирование. Компиляция была инкрементной, рефакторинг мгновенным, а «исходник» — просто красивой печатью дерева.
Плюсы: никаких holy-war’ов о табах, быстрая интеграция, встроенный VCS и отладка.
Минус: требовалась железная станция и знание Ada.
Вывод
Не нужно возвращаться к проекционным редакторам, но можно ли встроить идею «храним структуру, а не текст» в современные языки и IDE? Тогда форматирование станет личным вкусом, а не командным законом.
Комментарии (422)
- Одни считают форматирование важным каналом коммуникации и показателем вкуса/опыта разработчика, другие — пустым байкшедом, который должен решаться автоматическим линтером без обсуждений.
- Хранение кода не как текста, а как IR/AST (пример — Ada/DIANA, Unison) позволяет каждому видеть свой вариант форматирования, но ломает привычные grep, diff, git и другие текстовые инструменты.
- Проекционное редактирование (JetBrains MPS, Chrome DevTools «pretty») демонстрирует «один IR — много представлений», но требует специальных IDE и пока не стало массовым.
- Проблема смешанных языков, legacy, необходимости универсального стандарта IR и инерции экосистемы тормозит переход от plain-text.
- Автоформатеры (gofmt, Prettier, Black) уже закрывают 90 % вопросов: на сохранении/коммите единый стиль, локально можно настроить git-фильтры smudge/clean.
Code formatting comes to uv experimentally 🔥 Горячее 💬 Длинная дискуссия
uv format — экспериментальная команда в uv для форматирования кода. Под капотом вызывает Ruff, но не требует отдельной установки.
Как начать
# форматировать текущий проект
uv format
# проверить, без изменений
uv format --check
# только нужные файлы
uv format src/ tests/
Передача аргументов Ruff
Всё, что идёт после --, уходит напрямую в Ruff:
# исключить файлы
uv format -- --exclude="*_pb2.py"
# задать длину строки
uv format -- --line-length 100
Пока функция флажком --preview, но уже позволяет обойтись без отдельного бинарника ruff.
Комментарии (242)
- Пользователи спорят: стоит ли встраивать форматирование (
ruff format) вuvили это «feature-creep». - Одни рады единой команде
uv format, упрощающей жизнь новичкам и командам; другие требуют оставить инструменты раздельными, как в UNIX-way. - Создатели подчеркивают:
ruffиuvне сливаются;uv formatлишь удобный алиас, аналогичныйcargo fmt.
Gleam v1.12
-
Исправления
- Уточнено сообщение об ошибке с некорректной терминологией. (Louis Pilfold)
- JS: устранён сбой при использовании echo в модуле с функцией process. (Peter Saxton)
- Форматер: не переносит комментарий перед assert за него; корректно форматирует сообщения после echo/panic/todo/assert/let assert с комментарием перед ними; компилятор не генерирует неверный код для assert с пайпами на JS. (Giacomo Cavalieri)
-
Форматирование битовых массивов
- Трейлинг-Запятая управляет разбиением: с запятой — много строк; без — в одну строку.
- Если несколько сегментов на строке и убрана завершающая запятая, форматер сохраняет сегменты по одному на строку. (Giacomo Cavalieri)
-
Компилятор и генерация кода
- echo поддерживает пользовательское сообщение: echo 11 as "lucky number" печатает контекст и значение в stderr. (Giacomo Cavalieri)
- В сгенерированном JS doc-комментарии превращаются в JSDoc. (Giacomo Cavalieri)
- Уменьшен размер кода case на JS. (Surya Rose)
- Удаление неиспользуемого кода на этапе генерации (usage-based DCE). (Louis Pilfold)
- Улучшена поддержка echo для списков символов, ошибок и циклических ссылок JS. (Louis Pilfold)
- Улучшен внешний вид ошибок и предупреждений: контекстные метки выделяются иначе, чем источник проблемы. (Giacomo Cavalieri)
- Подсказка при импорте с точкой вместо слеша, с примерами корректного синтаксиса. (Zij-IT)
- Предупреждение при затенении импортированного имени верхнеуровневой константой/функцией. (Aayush Tripathi)
- Улучшено сообщение об неизвестной переменной, если, вероятно, имелась в виду проигнорированная (_x → x), с подсказкой. (Giacomo Cavalieri)
- Оптимизирован матчинг-паттернов на JS.
Комментарии (80)
- Обсуждение посвящено релизу Gleam: многие хвалят дизайн языка, читаемость, статическую типизацию и паттерн-матчинг; приводят пример кода и делятся позитивным опытом использования в проектах.
- Есть ссылки на пост о версии 1.12.0 и доклад на YouTube; некоторые ждут дальнейшего созревания экосистемы и возможности шаринга кода между фронтендом и бэкендом.
- Критика: отсутствие интерфейсов/тайпклассов и оператора композиции; кому-то синтаксис и «Error -> Error» кажутся неэлегантными; snake_case непривычен после TypeScript.
- В ответ отмечают осознанную простоту языка и официальную позицию Gleam по отказу от тайпклассов.
- Существенная часть треда уходит в спор о «идеологичном» футере сайта (инклюзивность, антинацистская позиция, права транс-людей): часть считает это лишним, другие — важным для безопасности и качества сообщества.
- Подчеркивается, что Gleam — это не только язык, но и сообщество с явным кодексом поведения; отсутствие позиции тоже является позицией.
- Некоторые участники призывают вернуться к техническим темам релиза, чтобы не повторять одни и те же дискуссии.