Axiom Справочник языка

11 · Процедуры и функции

Модули и исходные файлы

Программа может состоять из нескольких исходных файлов, но исполняется всегда одна конкретная точка входа. Каждый файл образует отдельный модуль, а связь между модулями задаётся импортом и модификаторами доступности. По умолчанию подпрограммы, типы, переменные и константы видны только внутри своего файла.

Состав программы

Программа имеет явную точку входа — файл, выбранный для запуска. Оператор IMPORT подключает другой модуль. Модификаторы PUBLIC и PRIVATE определяют, какие объявления можно использовать из импортирующего файла. Лексическая вложенность подпрограмм и время жизни переменных не заменяются модульной доступностью.

Файлы и имена

Имя модуля совпадает с именем файла без расширения .axm, а сравнение имён не учитывает регистр. Импортируемые файлы разрешаются в папке точки входа, включая зависимости импортов.

CLI читает их с диска. IDE использует текст открытой модели именованного файла, а закрытые зависимости читает с диска. Программа не создаёт отсутствующие исходники или каталоги. Для несохранённого документа нет папки поиска: такой импорт не разрешается. Несохранённые изменения открытых именованных зависимостей учитываются при проверке, подсказках и запуске без записи на диск, но точку входа перед запуском по-прежнему нужно сохранить.

При передаче исходников через API можно указать явный набор документов. Все переданные документы проходят проверку, однако инициализируются только достижимые от точки входа модули. В одном наборе имена модулей должны быть уникальны.

Снимок проекта в редакторе

Проверка и запуск фиксируют тексты открытых модулей из папки точки входа. В состав программы входят только явные импорты: посторонняя открытая вкладка не начинает исполняться автоматически. Если зависимость изменена, переименована или закрыта во время проверки, прежний ответ не применяется.

Подсказка импортированного имени обновляется после правки зависимости даже без изменения основного файла. Ошибка в другой строке основного файла не убирает подсказку корректно импортированного имени.

Например, откройте оба файла примера ниже и измените в tools.axm выражение value * value на value * value * value. Не сохраняя tools.axm, запустите сохранённый main.axm: IDE напечатает 125. CLI продолжит использовать сохранённую версию файла до её записи на диск.

Уже работающая программа и продолжение отладки используют прежний снимок. Правка зависимости во время INPUT или остановки влияет только на следующий запуск. Ошибка запущенной версии сохраняет исходный текст; её диапазон и стрелка отладки не переносятся на изменённую модель. Это правило действует и для файла, открытого после начала запуска. Фоновая проверка основного файла сохраняет сообщения об ошибках исполнения неизменённых зависимостей. При остановке программы командой Stop отменяется ожидающий автоматический переход к ещё не открытому файлу остановки отладки.

Инициализация и вызовы

Операторы верхнего уровня импортируемого модуля выполняются один раз за запуск, до операторов импортирующего модуля. Общая зависимость нескольких модулей не инициализируется повторно. При ошибке инициализации выполнение точки входа не начинается, а следующий запуск создаёт новое состояние программы.

Порядок независимых зависимостей соответствует порядку IMPORT. Если основной файл импортирует first и second, а каждый из них импортирует shared, модуль shared инициализируется один раз перед обоими импортирующими модулями. Пример общей зависимости печатает shared init один раз, затем 18.

Циклы IMPORT, включая импорт самого себя, запрещены. Рекурсия подпрограмм внутри модуля поддерживается. Ссылка на закрытую функцию может возвращаться из открытой функции: PRIVATE ограничивает доступ к имени, а не возможность вызова уже полученного функционального значения.

Типы и данные

PUBLIC TYPE доступен для объявлений, параметров и конструктора записи. Открытые переменные и константы импортируются по имени; BYREF сохраняет обычные правила передачи изменяемой переменной.

Открытая функция может принимать и возвращать закрытый TYPE, однако имя такого типа нельзя использовать снаружи. Поля уже полученной записи сохраняют обычный договор TYPE; PRIVATE ограничивает доступ к имени объявления, не делает запись доступной только для чтения и не вводит отдельного режима закрытых полей. Возможность изменить значение определяется обычными правилами переменных, констант и передачи аргументов.

Одноимённые закрытые TYPE в разных модулях являются разными типами. Их поля, конструкторы, методы и массивы независимы. Совпадение коротких имён не делает записи взаимозаменяемыми: значение одного типа нельзя передать параметру другого типа.

Например, first.axm объявляет закрытый TYPE Box с полем Item AS INTEGER и открытые функции FirstMake и FirstRead. second.axm объявляет собственный закрытый TYPE Box с полем Item AS STRING и функции SecondMake и SecondRead. Основной файл использует каждую пару отдельно:

IMPORT first
IMPORT second
PRINT FirstRead(FirstMake())
PRINT SecondRead(SecondMake())

Полный пример с обоими определениями TYPE печатает 11 и hello. Вызов FirstRead(SecondMake()) отвергается диагностикой MB2003: функция ожидает запись типа из first.axm.

Импорт не передаёт имена дальше автоматически: каждый файл явно импортирует те модули, к именам которых обращается. Квалифицированного доступа вида module.name и псевдонимов импортов пока нет.

Пример

Создайте два файла в одной папке. Файл tools.axm:

PUBLIC FUNCTION Square(value AS INTEGER) AS INTEGER
    RETURN value * value
END FUNCTION

Файл main.axm:

IMPORT tools
PRINT Square(5)

Запуск main.axm печатает 25. Готовые файлы: main.axm и tools.axm.

Открытие папки в IDE

Команда «Файл → Открыть проект» открывает все найденные файлы .axm в отдельных вкладках. Поле «Файл запуска» в панели проекта определяет точку входа: при первом открытии выбирается main.axm в корне папки, а при единственном файле — этот файл. Если файлов несколько и main.axm нет, выберите файл явно. Выбор сохраняется для папки. Переключение между модулями не меняет запускаемую программу; внешний файл запускается самостоятельно.

Пустая стартовая вкладка убирается, существующие модели и несохранённые правки сохраняются. Точка входа становится общей точкой анализа помощника, когда её документ открыт. При повторном запуске IDE восстанавливаются оставленные открытыми вкладки и выбранный файл запуска. Состав исполнения по-прежнему задаётся IMPORT: соседство в папке или открытая вкладка сами по себе не включают файл в программу.

Многомодульная игра

Готовый пример Maze Chase объединяет девять файлов: точку входа, конфигурацию, карту, калибровку, движение, героя, призрака, правила и отрисовку. Откройте main.axm в IDE и запустите его; ресурсы и файл калибровки находятся в той же папке. Закрытые переменные карты и персонажей изменяются через открытые процедуры. Общий TYPE Walker передаётся по BYREF, а функция выбора маршрута — значением.

В помощнике выберите main.axm общей точкой входа, чтобы видеть связи между файлами. Левая панель показывает объявления и разделы активного файла. Выбранная точка входа помощника не меняет запускаемый документ. Вызов через функциональный параметр отмечается как косвенный: граф не обещает статически определить его цель. Назначение модулей и управление описаны в описании проекта.

См. также

IMPORT · PUBLIC и PRIVATE · Подпрограммы