Перевести страницу

Создание приложений для науки и производства ещё не было таким простым

Блок (block)

Имя типа block. Блок – особый тип данных в Ci. Он используется для группировки многих операций с целью реализации ветвления и зацикливания алгоритма выполнения программы, а также для создания функций. Любой блок Ci программы изначально имеет текстовое представление, поскольку в нем задается последовательность операций. Начальное значение переменной: {} (пустой блок, «нет операций»).

Записывается блок между фигурными скобками:

    { <последовательность вызовов операций> }


Изолировано от операций блок появляться не должен, иначе возникнет ошибка при компиляции. Блочная константа указывается в качестве параметра у тех операций, которые ожидают данное типа block соответствующим параметром. Наиболее часто встречается операция if. Поэтому пример применения блоков приводится с ее использованием:

    if logvar { a = b };


В примере, если переменная logvar содержит TRUE, будет выполнен блок с одной операцией присваивания. Как видно по примеру, после операции присваивания нет точки с запятой, поскольку закрывающая скобка блока завершает компиляцию блока, автоматически ограничивая параметры у присвоения. Однако после закрывающей фигурной скобки присутствует точка с запятой, она ограничивает перечисление параметров операции if. В языке C ровно наоборот – перед закрывающей фигурной скобкой у последнего оператора необходима точка с запятой, а после – не нужна.


В текстовом виде block существует при написании программы и во время ее компиляции. Компилятор преобразует блок во внутреннее представление, которое потом обрабатывается процессором Ci, производящим вызовы функций на C для выполнения операций, включенных в блок. Во внутреннем представлении программе на Ci блок недоступен. Однако это не запрещает создавать переменные типа block, присваивать им значения и вызывать их выполнение. Нормальной является следующая запись:

    block a;

    a = { puts "вывод строки" };

    exec a;

последовательность действий не требует пояснений.


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

    exec {}; `ничего полезного не делает, только процессорное время зря тратит`

Операция exec просто выполняет указанный ей параметром блок. Ее недостаточно для создания функций, поскольку ей нельзя передать параметры и получить возвращаемое значение. Эти возможности предоставляет операция call, описанная в справочнике по операциям.


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

    int a b;

    for a `from` 1 `to` 9 `with step` 1

    {

        for b 1 9 1

        {

            stdout (a * b) " "

        };

        stdout "\n"

    };

Переменные, объявленные в объемлющем блоке, доступны во вложенных в него. Переменные, объявленные внутри блока, доступны внутри него, и во вложенных, но недоступны в объемлющих. Однако, в текущей версии Ci все переменные внутри Ci-программы должны иметь уникальные имена – это временное ограничение реализации. При выполнении программы переменные будут создаваться в тот момент, когда выполнение блока дойдет до места, где они объявлены. Но удаляются все переменные в конце блока, после выполнения его последней операции.


Данные типа блок не преобразуются в данные другого типа. В случае, если бы было реализовано преобразование из строки в блок, то функция такого преобразования включила бы в себя вызов компилятора. Для выполнения обратного преобразования из блока в строку, требуется реверсивный процессор, аналогичный дизассемблеру.


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

exec {

``выполняется Ci-системой





``код программы, которую ``пишет

`` программист на Ci

puts “Hello world”;

}


Наклонным шрифтом обозначен «главный блок», который выполняется автоматически.


Сравнения блоков не поддерживаются.