Пользовательские модули
Модуль — пространство имён и граница видимости. Он не меняет вычисления, владение, эффекты или порядок исполнения. В 0.0.17 программа компилируется целиком: импорты разрешаются до построения общего Semantic IR.
Импорт и корень проекта
import tables.connections загружает tables/connections.liza относительно
корня проекта. По умолчанию корень — каталог входного файла.
Его можно задать явно для всех команд компилятора:
python3 -m liza check examples/connection_table.liza
python3 -m liza run examples/connection_lookup.liza -O 2
python3 -m liza build app/main.liza --project-root .
Путь импорта состоит из идентификаторов, разделённых точками. Входной файл
также должен иметь расширение .liza и путь из таких компонентов относительно
корня. Поиска в рабочем каталоге, родительских каталогах, переменных окружения
или интернете нет. Символические ссылки внутри пути модуля и несовпадение
регистра имён отвергаются на всех платформах. .., абсолютные пути и строковые
пути в import не поддерживаются.
Каждый модуль явно импортирует собственные зависимости. Импорт не передаётся
потребителям транзитивно и не является реэкспортом. Порядок объявлений внутри
файла не ограничивает вызовы вперёд. Повторный импорт в одном файле — ошибка;
общая зависимость разных модулей загружается один раз. Цикл диагностируется
с цепочкой модулей, например main -> a -> b -> a.
Имя пространства импорта нельзя затенить объявлением, параметром или локальной
привязкой. Полное имя объявления не может совпадать с именем загруженного
модуля: один квалифицированный путь не обозначает одновременно тип и модуль.
console и file зарезервированы за существующей стандартной библиотекой;
их API по-прежнему доступны без пользовательского import.
Экспорт и поля
Объявления fn, struct и enum приватны по умолчанию. pub открывает
конкретное объявление для других модулей:
// counter.liza
pub struct Counter {
value: u32
}
pub fn create() -> Counter {
return Counter(0)
}
pub fn read(counter: Counter) -> u32 {
return counter.value
}
Потребитель может хранить counter.Counter, передавать его функциям, применять
copy и move согласно свойствам типа. Он не может читать или обновлять value
и не может вызвать конструктор counter.Counter(0).
Экспорт структуры не экспортирует её поля. Поле открывается отдельно:
Чтение и обновление публичных полей извне разрешены; для обновления по-прежнему
нужны var, доступное значение и отсутствие активного readonly-заимствования.
Позиционный конструктор доступен извне, только если публичны все поля.
Внутри определяющего модуля доступны все поля и конструкторы.
Публичная функция, публичное поле или payload публичного enum не могут раскрывать приватный тип. При этом приватные поля публичной структуры могут содержать приватные типы: так устроен внутренний слот таблицы соединений. Экспорт enum открывает все его варианты; отдельной приватности вариантов пока нет.
Идентичность типов
Тип определяется объявлением в конкретном модуле. a.Id и b.Id различны,
даже если оба содержат одно поле u32. Ромбовидный импорт
main -> a/b -> common сохраняет одну идентичность common.Id.
Идентичность внутри проекта определяется каноническим путём модуля от корня
и именем объявления. Перенос каталога проекта не меняет её. Абсолютный путь
на диске используется в диагностике, но не становится именем типа в IR.
Квалифицированные типы работают в массивах, структурах, View, Option, Result
и сигнатурах функций. Варианты записываются как module.Type.Case в выражениях
и ветвях match.
Владение, эффекты и стоимость
pure не может вызвать io через импорт. move прекращает доступ через прежнюю
привязку; readonly views сохраняют лексические ограничения; File остаётся
move-only ресурсом с проверяемым закрытием. Модуль не добавляет глобального
состояния, инициализаторов или скрытых вызовов при импорте.
Таблица находится в examples/tables/connections.liza. Её используют
examples/connection_table.liza и examples/connection_lookup.liza.
Служебные поля таблицы закрыты. ConnectionId и данные записи имеют публичные
поля; возвращаемые результаты открывают поля table и result.
Межмодульный тест повторных обновлений охватывает 64, 4096 и 16384 записи
на O0/O2. В выбранном тракте единственного владельца нет полных копий внутри
edit и на циклических путях. Начальная копия входа и копии для живых снимков
могут сохраняться. Прежние результаты и независимость копий проверяются отдельно.
Это гарантия проверенного тракта, а не обещание фиксированного числа наносекунд.
Границы этапа
Нет aliases, wildcard imports, реэкспортов, пакетного менеджера, отдельной компиляции, стабильного межмодульного ABI или загрузки библиотек во время исполнения. Все достижимые через импорты модули проверяются целиком, включая неиспользуемые приватные функции.
0.0.18 — generics добавляет параметризацию типов и алгоритмов. Первый вариант планируется через мономорфизацию; ограничения и стоимость инстанцирования требуют отдельного контракта.