Модули
Программа на языке Тривиль состоит из модулей (единиц компиляции), исходный текст каждого модуля расположен в одном или нескольких исходных файлов.
Каждый исходный файл состоит из заголовка модуля, за которым следует, возможно, пустой список импорта, за которым следует, возможно, пустой набор описаний типов, констант, переменных, функций и методов и, возможно, вход в модуль.
Модуль: Исходный-файл+
Исходный-файл:
Заголовок-модуля
Список-импорта
Описание-или-вход*
Заголовок-модуля:
'модуль' Идентификатор Разделитель
('осторожно' Разделитель)?
Описание-или-вход: Описание | Вход
Заголовок модуля
Каждый исходный файл начинается с заголовка модуля. Заголовок содержит идентификтор, который определяет модуль, к которому принадлежит файл. Идентификатор не принадлежит никакой области действия и не связан ни с каким объектом.
Заголовок модуля может содержать признак осторожно, который означает, что в исходном файле можно использовать небезопасные операции.
Импорт
Наличие импорта в исходном файле указывает, что этот исходный файл зависит от функциональности импортируемого модуля. Импорт обеспечивает доступ к экспортированным идентификаторам импортируемого модуля.
Каждый импорт содержит путь импорта, указывающий на размещение импортируемого модуля.
Список-импорта: Импорт*
Импорт: 'импорт' Путь-импорта Разделитель
Путь-импорта: '"' Путь-в-хранилище | Файловый-путь '"'
Явное задание имени импорта
Импорт добавляет описание идентификатора, текстуально равного последнему имени в пути импорта, который будет использоваться для доступа к экспортированным объектам импортируемого модуля.
модуль x
импорт "стд::вывод"
вход {
вывод.ф("Привет!")
}
Путь импорта может быть задан как путь в хранилище исходных текстов или как файловый путь. В любом случае, в итоге, он должен указывать на папку, содержащую исходные файлы импортируемого модуля.
Путь-в-хранилище:
Имя-хранилища '::' Имя-папки ('/' Имя-папки)*
Путь в хранилище состоит из имени хранилища, которое явным или неявным образом (см. README) должно быть привязано к определенной папки файловой системы и пути, относительно этой папки:
импорт "стд::юникод/utf8"
пусть декодер = utf8.декодер(...)
Язык не определяет формально набор символов, которые могут использоваться в имени хранилища и имени папки, надеясь на здравый смысл разработчиков.
Файловый путь может быть аболютным или относительным (в терминах инструментальной платформы). Не рекомендуется использовать абсолютные пути, так как это приводит к непереносимому коду. Относительный путь всегда трактуется как путь относительно той папки, в которой запущен компилятор (рабочая папка).
Например в случае импорта:
импорт "трик/лексер"
будет импортирован модуль, который расположен в подпапке трик/лексер рабочей папки.
Имена папок должны разделяться символом / (слеш) независимо от инструментальной платформы, на которой используется компилятор.
%Ошибка компиляции, если знак экспорта указан для идентификатора, описанного не на уровне модуля.
Вход или инициализация модуля
Модуль может содержать действия, которые выполняются при инициализации модуля – вход в модуль.
Вход: 'вход' Блок
Описать: переменные с поздней инициализацией
Система должна обеспечивать следующие условия инициализации модуля М:
- инициализация модуля выполняется один раз
- инициализации
Мвыполняется после инициализации всех модулей, которые импортируетМ - инициализации
Мвыполняется до инициализации тех модулей, которые импортируютМ
Инициализация и исполнение программы
Программа состоит из головного модуля и всех прямо или косвенно импортированных модулей.
Исполнение программы состоит из:
- инициализации всех модулей, импортированных из головного модуля. Это приводит к рекурсивной инициализации всех используемых модулей программы. Для корректной инициализации граф импорта должен быть ациклическим.
- и, затем, выполнение входа головного модуля.