Модули
подключить утилиты;
Подключает файл утилиты.код — поиск идёт по трём уровням, по порядку:
- Рядом с текущим файлом (для разбиения своего же проекта на файлы).
- В папке
пакеты/в корне проекта (простое, локальное место для
стороннего кода — сюда сфера_пакеты ставит зависимости, см. раздел
"Пакетный менеджер" ниже; можно и вручную положить чужой .код-файл).
- В системной стандартной библиотеке, установленной рядом с самим
компилятором — именно этот уровень позволяет подключить сеть; (или
хранилище, база_данных, графика) работать в ЛЮБОМ новом проекте,
в любой папке, без ручного копирования файлов стандартной библиотеки
— та же модель, что import os в Python: язык сам знает, где лежит
его собственная библиотека.
⚠️ Уровень 3 требует, чтобы компилятор был установлен через собрать.sh
(macOS/Linux) или установить-windows.ps1 (Windows) — они синхронно
копируют актуальную стандартную библиотеку в системное место при каждой
сборке. При разработке самого компилятора (бинарник запущен прямо из
target/release/ внутри репозитория) поиск тоже работает — находит
стандартная_библиотека/ в корне репозитория автоматически.
Доступ к содержимому — либо напрямую по имени, либо явно, через имя модуля:
целое итог = удвоить(21); // обычный вызов
целое итог2 = утилиты.удвоить(21); // то же самое, но с указанием модуля
Составное имя — файл внутри подпапки
подключить пакет.файл;
Каждая точка в имени — это папка: пакет.файл ищет пакет/файл.код
(на каждом из трёх уровней поиска выше — рядом с файлом, в пакеты/,
в системной стандартной библиотеке). Это то же самое имя пакет.файл,
которое парсер понимал ещё до этого изменения (подключить а.б.в;
разбирается на любое число частей), но раньше точка становилась частью
искомого имени файла буквально — теперь это настоящий путь. Основное
применение — как раз пакеты, установленные сфера_пакеты (см. ниже):
каждый пакет живёт в своей собственной папке пакеты/ИМЯ_ПАКЕТА/, и
файл утилиты.код внутри него подключается как `подключить
ИМЯ_ПАКЕТА.утилиты;`.
Имя МОДУЛЯ для квалифицированного доступа (модуль.имя(...)) в этом
случае — ИМЯ_ПАКЕТА_файл (с подчёркиванием, одно слово): `подключить
геометрия_доп.векторы; даёт доступ через геометрия_доп_векторы.длина(...)`.
Исключение — самый частый случай, когда у пакета один файл с тем же
именем, что и сам пакет (пакеты/геометрия/геометрия.код): тогда можно
писать просто подключить геометрия; (без точки — компилятор сам находит
файл внутри одноимённой папки пакета) и обращаться как геометрия.площадь(...)
— без дублирования имени.
Именно это (разные модули, подключитьнные из разных пакетов, но с
ОДИНАКОВЫМ именем файла, например утилиты.код у двух не связанных друг
с другом пакетов) раньше было главной дырой в изоляции: один пакет молча
перезаписывал файл другого на диске при установке, а даже если бы не
перезаписывал — оба зарегистрировались бы под одним и тем же именем
модуля утилиты, и совпадение имени функции внутри них стало бы
неотличимой ошибкой "функция объявлена повторно". Составное имя
закрывает оба уровня разом: и файлы на диске, и имена модулей для
модуль.имя(...), теперь действительно изолированы по пакету.