Модули

подключить утилиты;

Подключает файл утилиты.код — поиск идёт по трём уровням, по порядку:

  1. Рядом с текущим файлом (для разбиения своего же проекта на файлы).
  2. В папке пакеты/ в корне проекта (простое, локальное место для

стороннего кода — сюда сфера_пакеты ставит зависимости, см. раздел "Пакетный менеджер" ниже; можно и вручную положить чужой .код-файл).

  1. В системной стандартной библиотеке, установленной рядом с самим

компилятором — именно этот уровень позволяет подключить сеть; (или хранилище, база_данных, графика) работать в ЛЮБОМ новом проекте, в любой папке, без ручного копирования файлов стандартной библиотеки — та же модель, что import os в Python: язык сам знает, где лежит его собственная библиотека.

⚠️ Уровень 3 требует, чтобы компилятор был установлен через собрать.sh (macOS/Linux) или установить-windows.ps1 (Windows) — они синхронно копируют актуальную стандартную библиотеку в системное место при каждой сборке. При разработке самого компилятора (бинарник запущен прямо из target/release/ внутри репозитория) поиск тоже работает — находит стандартная_библиотека/ в корне репозитория автоматически.

Доступ к содержимому — либо напрямую по имени, либо явно, через имя модуля:

целое итог = удвоить(21);              // обычный вызов
целое итог2 = утилиты.удвоить(21);     // то же самое, но с указанием модуля

Составное имя — файл внутри подпапки

подключить пакет.файл;

Каждая точка в имени — это папка: пакет.файл ищет пакет/файл.код (на каждом из трёх уровней поиска выше — рядом с файлом, в пакеты/, в системной стандартной библиотеке). Это то же самое имя пакет.файл, которое парсер понимал ещё до этого изменения (подключить а.б.в; разбирается на любое число частей), но раньше точка становилась частью искомого имени файла буквально — теперь это настоящий путь. Основное применение — как раз пакеты, установленные сфера_пакеты (см. ниже): каждый пакет живёт в своей собственной папке пакеты/ИМЯ_ПАКЕТА/, и файл утилиты.код внутри него подключается как `подключить ИМЯ_ПАКЕТА.утилиты;`.

Имя МОДУЛЯ для квалифицированного доступа (модуль.имя(...)) в этом случае — ИМЯ_ПАКЕТА_файл (с подчёркиванием, одно слово): `подключить геометрия_доп.векторы; даёт доступ через геометрия_доп_векторы.длина(...)`. Исключение — самый частый случай, когда у пакета один файл с тем же именем, что и сам пакет (пакеты/геометрия/геометрия.код): тогда можно писать просто подключить геометрия; (без точки — компилятор сам находит файл внутри одноимённой папки пакета) и обращаться как геометрия.площадь(...) — без дублирования имени.

Именно это (разные модули, подключитьнные из разных пакетов, но с ОДИНАКОВЫМ именем файла, например утилиты.код у двух не связанных друг с другом пакетов) раньше было главной дырой в изоляции: один пакет молча перезаписывал файл другого на диске при установке, а даже если бы не перезаписывал — оба зарегистрировались бы под одним и тем же именем модуля утилиты, и совпадение имени функции внутри них стало бы неотличимой ошибкой "функция объявлена повторно". Составное имя закрывает оба уровня разом: и файлы на диске, и имена модулей для модуль.имя(...), теперь действительно изолированы по пакету.