Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования FPTL и средства работы с ним.pdf
Скачиваний:
30
Добавлен:
28.06.2014
Размер:
226.48 Кб
Скачать

Constructors

{

=>List : c_nil;

'x*List['x] => List['x] : c_cons;

}

List = c_nil ++ ('x * List).c_cons;

}

В данном примере создается абстрактный тип данных «список». Тип элементов, которые он будет содержать, определяется дальше в программе (явно или неявно). Возможно использование в качестве типовых параметров и типов данных, которые сами имеют типовые параметры (например, создание списка списоков строк).

Описание программы

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

Scheme factorial

{

factorial = P -> F1, F2; P = (id*<0>).eq;

F1 = <1>;

F2 = (id * DEC.@).mult; DEC = (id*<1>).minus;

}

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

Имя функциональной переменной = описание функциональной переменной;

В описании функциональной переменной мы можем использовать три введенные ранее операции композиции, функциональные переменные, определенные в нашей схеме, а также все встроенные функции языка. В программе явно не указываются аргументы функциональных переменных. По сути, они передаются неявно. Например, аргументы функциональной переменной factorial будут переданы в функциональные переменные P, F1, F2 при их вызовах из factorial. Получить значение аргументов можно либо при помощи функции id, результатом которой являются все ее входные аргументы ( id(a)=a), либо при помощи функции I(m, n) – выбор m-ного аргумента из n входных аргументов. В программе может быть использован символ “@” – он является синонимом функциональной переменной с именем, совпадающим с именем схемы.

Процесс выполнения функциональной программы

Опишем то, как меняется аргумент функциональных переменных в процессе выполнения функциональной программы.

В factorial мы передаем одно целое число типа int. Оно же передается в P, F1, F2.

ВP мы берем аргумент функциональной переменной (id возвращает целое число) и приписываем к нему справа еще одно целое число – константу ноль. Этот кортеж из двух чисел становится аргументом функции eq (проверка на равенство). Результат функции eq (булевское значение) становится результатом функциональной переменной P.

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

ВF2 мы берем входной параметр (целое число) и к нему справа приписываем результат вызова функций DEC.@ (эквивалентно DEC.factorial). Результатом фукциональной переменой DEC будет целое число (см. ниже). Оно передается на вход функциональной переменной factorial. На выходе из нее мы получим также целое число (см. выше). Соответственно, результатом вызова пары DEC.@ будет одно целое число. Мы приписываем его справа к арументу функции F2 (id) и передаем полученную пару целых чисел на вход функции mult (умножение). Ее результат (целое число) будет являться результатом функциональной переменной F2.

ВDEC мы берем аргумент функциональной переменной (целое число), приписываем к нему справа целочисленную константу (1) и передаем полученную пару чисел на вход функции minus (вычитание). Полученное целое число будет результатом функциональной переменной.

Вызов программы

Вызов программы, описанной в схеме, производится из секции Application программы:

Application

%factorial(6)

или

Application

Array[int] : a =

(15 * (910 * (200 * (0 * (8 * (75 * (3 * (12 * (7 * (6 * (1 * (4 * (15 * (40 * c_empty).c_add

).c_add).c_add).c_add).c_add).c_add).c_add).c_add).c_add).c_add).c_add).c_add).c _add).c_add;

%BubbleSort(a)

Во втором примере показан пример объявления переменных в секции Application. Это необязательная практика. Описание переменной в секции Application имеет вид:

Тип переменной : имя переменной = значение переменной;

Полный пример программы

Functional Program factorial

Scheme factorial

{

factorial = P -> F1, F2;