11 · Процедуры и функции
Оператор IMPORT
Программа растёт, и её части удобнее держать в отдельных исходных файлах. Чтобы один файл мог пользоваться подпрограммами, типами и данными другого, он подключает его оператором IMPORT: после этого открытые имена зависимости доступны без префикса.
Синтаксис и расположение
IMPORT moduleNamemoduleName — идентификатор, совпадающий с именем файла без расширения. Это имя, а не строковый путь; точки, разделители каталогов, расширение и кавычки не указываются.
Оператор записывается в начале файла до объявлений и исполняемых инструкций. Каждый файл задаёт собственные импорты. В IDE открытая именованная зависимость берётся из снимка редактора вместе с несохранёнными правками; закрытая зависимость читается с диска. Уже запущенная программа использует снимок начала запуска. В CLI и IDE поиск выполняется в папке сохранённой точки входа; расширение файла — .axm.
Действие
Открытые имена зависимости становятся доступными без префикса. Закрытые имена остаются доступны только внутри исходного модуля. Импортированный модуль и его зависимости инициализируются до текущего модуля. Повторение одного IMPORT не запускает инициализацию повторно.
Простейший случай — подключение одного файла с открытой функцией:
IMPORT tools
PRINT Square(5)Запускаемый пример и содержимое зависимости приведены в разделе «Модули и исходные файлы».
Правила и ограничения
Циклический импорт, включая импорт текущим файлом самого себя, запрещён даже при отсутствии исполняемых инструкций. Имена SUB и FUNCTION не могут совпадать с именами встроенных функций. Два импорта с одинаковым открытым именем одной категории дают неоднозначность: SUB и FUNCTION составляют одну категорию, DIM и CONST — другую, TYPE — третью. Переименуйте объявление или измените состав импортов. Локальное объявление не может заменять импортированное имя той же категории. PUBLIC в импортирующем модуле не переэкспортирует чужие объявления.
Совпадение имён разных категорий допускается. В выражении вызова сначала ищется конструктор TYPE, затем переменная, затем подпрограмма. Если переменная INTEGER имеет имя функции, попытка вызова даёт MB2020; функция не выбирается автоматически.
Относительные пути файловых операций по-прежнему разрешаются от папки запущенного файла в IDE. Импорт не меняет рабочую папку и не создаёт файлы или каталоги.
Диагностика
- MB2049
- Модуль отсутствует в составе программы или не найден в папке точки входа.
- MB4004
- CLI не смог прочитать зависимость из-за отказа файловой системы, например отсутствия доступа к найденному файлу. Это отличается от MB2049, когда модуль не найден. Команды check и run завершаются с кодом 2; команда check --json сохраняет формат JSON и возвращает эту диагностику в нём.
- MB2050
- Несколько документов задают одно имя модуля.
- MB2051
- В явном наборе модулей не найдена точка входа.
- MB2052
- Обнаружен цикл импорта или импорт самого себя.
- MB2053
- Внешнее обращение использует закрытое имя.
- MB2054
- Несколько импортов открывают одинаковое имя одной категории.
- MB2055
- Импортированное имя конфликтует с другим доступным объявлением.
- MB1001–MB1002
- Нарушена запись или расположение IMPORT.