открыть: Синтаксис 2Syntax 1

Модули

Пока не реализовано в интерпретаторе.

Модуль в ksi - это программа, занимающая весь один файл. Имя модуля начинается с символа @. Чтобы назначить модулю имя используется следующая конструкция, которая располагается в начале файла (ей могут предшествовать только пробельные символы и комментарии):

@Имя_модуля ;

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

@main ~ 'lib_1.ksi' 'd:/prj/lib_2.ksi' '../more/lib_3.ksi' ;

Пути к файлам могут быть как абсолютные, так и заданы относительно текущего файла. Они заключаются в одинарные кавычки (для экранирования одинарной кавычки внутри пути используется символ \, а для использования самого символа \ он дублируется). Пути могут быть перечислены через необязательную запятую.

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

@ ~ 'd:\\prj\\lib\'33.ksi' -- путь ~ d:\prj\lib'33.ksi ;

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

Если подключаемый файл не найден, то выдаётся ошибка "parse error" и загрузка далее не продолжается. Если имя загружаемого модуля уже занято уже загруженным модулем, то тоже будет выдана ошибка. В этих случаях ни один модуль не будет передан на выполнение.

После того как все модули из очереди успешно загружены, они передаются на выполнение в обратном порядке загрузки.

Разграничение имём пользовательских функций, классов и перечислений

Разные модули могут содержать класс (или функцию) с одним и тем-же именем. При обращении к такому классу по имени будет использован класс из того модуля, который был загружен раньше других. Однако есть возможность указать явным образом из какого модуля класс необходим. Для этого после имени класса ставится собачка @ и имя требуемого модуля (без пробелов). Чтобы указать явным образом класс из того-же файла можно просто поставить собачку без имени модуля (например $point@). Всё это правило распространяется также на функции и перечисления.

Рассмотрим пример из двух файлов. Первый файл 'main.ksi'. Его мы и будем запускать.

-- main.ksi @main ~ 'lib.ksi' ; $point ~ x y z ; -- 3 свойства `plain pt = # #as $point pt_lib = # as $point@lib pt_also = # &new_point_2@lib #

Второй файл 'lib.ksi' расположен в той же папке. Это подключаемая библиотека.

-- lib.ksi @lib; $point ~ x y ; -- 2 свойства &new_point_2 n1 n2 ~ ret = # #as $ ; `plain pt = # #as $point pt_2 = # #as $point@

В этом примере локальным переменной pt обоих файлов будут присвоены объекты класса $point из модуля @main, так как этот модуль будет загружен раньше, чем модуль @lib. А переменной pt_lib будет присвоен объект класса $point из файла "lib.ksi", так как это указано явно. В файле "lib.ksi" локальной переменной pt_2 тоже будет присвоен объект из модуля @lib. Из какого модуля будет присвоен объект в переменную pt_also догадайтесь сами.

Дополнительные особенности

Имя модуля может быть значением переменной.

@main; `plain mod = @ -- указатель на текущий модуль

Native функции для работы с модулями

@ ~ 'lib.ksi' ; `plain types = @lib #module_types # -- Получить массив типов (классов и перечислений), определённых в указанном модуле. fns = @lib #module_fns # -- Получить массив указателей на функции, определённых в указанном модуле. type = $point mod = type #module # -- Получить указатель на модуль, в котором определён указанный тип. Для native типов возвращает # (null) fn = &new_point_2& -- указатель на функцию value = 5 mod = fn #module value -- Получить указатель на модуль для функции, вызываемой для значения аргумента value. -- Перегрузка функции будет учтена при вызове: value fn! anything -- Если функция не перегружена для указанного значения, то #module вернёт # (null). path = 'lib.ksi' cur_mod = @ mod = path #module_by_path cur_mod -- Вернёт указатель на модуль, находящийся в указанном файле. -- Аргумент cur_mod служит для определения относительного пути. -- Если файл не загружен - вернёт # (null).