Программирование на языке «Ядро»: Руководство пользователя, страница 9

1.4.6. Выражения, содержащие точку с запятой

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

1.4.7. Условные выражения

Условные выражения – это выражения с операциями if, then, else. Операция if – префиксная; она применяется к основе, вырабатывающей последовательность булева типа, и делает её условием выбора. Операции then и else – инфиксные, их левым аргументом должно быть условие, правым – альтернатива выбора.

Условное выражение вырабатывает последовательность значений, которые составляются из значений альтернатив в соответствии со значениями условия выбора. Если условие скалярное, то берется целиком последовательность then при истинном условии и последовательность else при ложном условии. Если условие выбора представляет собой последовательность булевых значений, то результирующая последовательность получается выбором соответствующих значений из последовательностей-альтернатив.

Примеры:

integer A[0];

A set_value (if true then (1,2) else 4);

A dsply;

A set_value (if false then (1,2) else 4);

A dsply;

A set_value (if (true, false, true) then (1,2,3) else (4,5,6));

A dsply;

В результате интерпретации получено:

1 2

4

1 5 3

Первая строка вывода содержит целиком последовательность then, вторая строка – целиком последовательность else. В третьей строке вывода содержится последовательность, составленная из первого элемента альтернативы then, второго элемента альтернативы else и третьего элемента then, поскольку условие выбора – последовательность, первый элемент которой имеет значение true, второй – false и третий – true.

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

Приведем примеры выравнивания последовательностей в условном выражении:

A set_value (if (true, false, true) then (1,2,3,4) else (5,6));

A dsply;

В результате получено:

1 6

(все три последовательности усечены до длины 2).

A set_value (if (true, false, true) then (1) else (5,6,7));

A dsply;

В результате получено:

1 6 1

(скаляр в последовательности then повторяется нужное число раз).

В альтернативах могут быть любые выражения, в том числе содержащие операции присваивания и точки с запятыми. Их интерпретация выполняется до окончательного формирования последовательности-результата. Благодаря этому условные выражения языка «Ядро» можно использовать так же, как условные операторы в обычных языках программирования.

1.4.8. Выражения с циклами

Циклическое выражение в языке «Ядро» может использоваться аналогично операторам цикла в традиционных языках и в то же время обладает более широкими изобразительными возможностями, позволяя строить последовательность путем вычисления выражения, зависящего от параметра, при циклическом изменении этого параметра.

Синтаксис выражения с циклом можно определить таким образом:

<выражение> on <последовательность переменных> from <последовательность значений>

Левый аргумент инфикса on – произвольное выражение. Правым аргументом является инфиксная операция from, которая в свою очередь имеет два аргумента: левый – параметр цикла, правый – последовательность его значений. Заметим, что параметр цикла должен содержать только имена переменных (в том числе индексированных). Мощность параметра цикла должна быть конечной. Последовательность значений параметра тоже должна быть конечной, причем её мощность обычно превышает мощность параметра цикла. Интерпретация циклического выражения состоит в том, что параметру поочередно присваиваются подпоследовательности нужной длины из последовательности значений, пока она не будет исчерпана; после каждого присваивания параметра вычисляется значение левого выражения, и полученная последовательность добавляется к результирующей.

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

(A[i] on i from 1:sizearr A) dsply;

{переменная A описана и заполнена в предыдущем примере}

В результате получено:

1 6 1

Здесь параметр цикла i – скалярная целая переменная, которая должна быть описана, как обычно. Последовательность её значений задана прогрессией от 1 до размера массива A с шагом 1. Циклическое выражение дает все элементы массива A.

Заметим, что скобки в приведенном выражении обязательны; это связано с тем, что приоритет операции on ниже, чем приоритет операции dsply.

A set_value 2*i+1 on i from 1:5; A dsply;

Здесь в правой части операции присваивания set_value находится циклическое выражение с параметром i, которое вырабатывает последовательность значений 2*i+1 при всех заданных значениях i. Результат интерпретации:

3 5 7 9 11

Приведем пример циклического выражения, которое вырабатывает последовательность имен переменных:

(i on i from 1:5) dsply;

Результат оказывается несколько неожиданным:

5 5 5 5 5

Это связано с тем, что вывод операцией dsply производится после того, как вычислено циклическое выражение. Результатом является пятикратное повторение переменной i, а она после цикла принимает последнее значение, равное 5. Если нужна последовательность значений параметра цикла в процессе циклического перебора, то необходимо явно преобразовать имя в значение, например, с помощью префикса +:

(+i on i from 1:5) dsply;

Тогда получается результат:

1 2 3 4 5

Рассмотрим пример, в котором циклическое выражение полностью аналогично оператору цикла в традиционных языках:

(A add_value i) on i from 1:10;

Здесь выражение в скобках – оператор, который повторяется при всех значениях i из последовательности от 1 до 10. Он выполняется в цикле, и в результате в массив А добавляются значения 1, 2, …, 10.

Заметим, что и в этом случае скобки являются обязательными: без них правой частью инфикса set_value было бы всё циклическое выражение (i on i from 1:10), вследствие чего в А была бы добавлена последовательность из десяти одинаковых значений переменной i (последнее значение этой переменной в цикле равно 10).

2.  Использование языка «Ядро» для генерирования конечно-элементных сеток