| |||||||
Раздел 3: Язык Express: процедуры и функцииПроцедуры и функции в языке Express служат для описания процедурной части модели. Как и в алгоритмических языках, используется концепция формальных и фактических параметров. Описание процедуры начинается с служебного слова procedure, за которым следуют идентификатор процедуры и описание формальных параметров в круглых скобках. Пример описания заголовка процедуры:
PROCEDURE eq (x,y: REAL; n: INTEGER; VAR RESULT: route); Аналогично описываются функции, их отличает только описание в заголовке типа результата после закрывающей скобки:
FUNCTION log (a: REAL; m: INTEGER): REAL; Локальные переменные, описанные в блоке действуют только в пределах данных функции или процедуры:
LOCAL ... END_LOCAL; Ряд функций и процедур относится к стандартным и потому не требует
описания во вновь разрабатываемых моделях. Отметим следующие
стандартные функции: Abs — абсолютная величина; Sqrt — корень квадратный; Exp — экспонента; Log, Log2, Log10 — логарифмы натуральный, двоичный, десятичный соответственно; Sin, Cos, Tan, Acos, Asin, Atan — тригонометрические и обратные тригонометрические функции sin, cos, tg, arc cos, arc sin, arc tg.
В число стандартных входят также функции: BLength — подсчет числа бит в двоичном коде; HiBound — верхняя граница индекса у array или верхняя граница числа элементов у set, bag, list; LoBound — то же в отношении нижних границ; Length — подсчет числа символов в строке; Odd — возвращает значение true, если аргумент — нечетное число; SizeOf — возвращает число элементов в объекте агрегативного типа; TypeOf — возвращает список типов, к которым принадлежит параметр этой функции; Exists — возвращает значение true, если аргумент этой функции входит в число атрибутов соответствующей сущности и др.
К стандартным процедурам относятся процедуры Insert и Remove — вставка или изъятие элемента в заданной позиции у объекта агрегативного типа соответственно.
При описании алгоритмов в телах процедур и функций могут использоваться операторы пустой (Null), присваивания (Assignment), выбора (Case), составной
(Compound Statement), условный (if..then..else), цикла (Repeat), выхода
из функции или процедуры (Return), перехода на конец цикла (Skip).
В выражениях используются операнды, знаки операций, вызовы
функций. Так, для арифметических операций над числами типа real
применяются следующие знаки: * — умножение, / — деление, DIV — целочисленное деление, + — сложение, - — вычитание, ** — возведение в степень, MOD — деление по модулю.
Знаки логических операций: not — отрицание, and — конъюнкция, or — дизъюнкция, xor
— исключающее ИЛИ. В применении к величинам типа logical эти операции
выполняются по правилам действий в трехзначном алфавите. Логическое
выражение a1 in a2 принимает значение true, если a1 содержится в a2.
Оператор like используется для посимвольного сравнения строк. Знаки отношений равно =, не равно <>, больше >, меньше <, больше или равно >=, меньше или равно <=. Для сравнения экземпляров сущностей используют операции "равно" и "неравно" со знаками :=: и :<>: соответственно.
Операции над множествами (типами bag и set) — пересечение
(Intersection), объединение (Union), разность (Difference). Их знаки
суть * (умножение), + (плюс), — (минус) соответственно. Оператор Query
(A <* B | C) возвращает подмножество тех элементов из агрегативного
типа B, для которых выполняется условие C, здесь A — простая
переменная, используемая в C.
Знак + (плюс) по отношению к операндам типа binary или string есть знак конкатенации.
В качестве формальных параметров процедур и функций, кроме типов данных, применяемых в других конструкциях языка и охарактеризованных выше,
могут использоваться обобщенные типы: generic, aggregate и некоторые
другие. Тип generic формального параметра означает, что соответствующий
фактический параметр может иметь любой тип данных из числа
предусмотренных при описании процедуры. Аналогично тип aggregate
обобщает агрегативные типы данных — array, bag, list, set. Например:
Пример 1
FUNCTION add (a,b: GENERIC: intype): GENERIC: intype; LOCAL nr: number; vr: vector; END_LOCAL; IF ('number' IN TYPEOF (a)) AND ('number' IN TYPEOF (b)) THEN nr := a+b; (* функция typeof (a) возвращает тип аргумента а и, если этот тип есть number, то первый операнд логического выражения равен true *) RETURN (nr); ELSE IF ('this schema.vector' IN TYPEOF (a)) AND ('this schema.vector' IN TYPEOF (b)) THEN vr.i := a.i + b.i; vr.j := a.j + b.j; vr.k := a.k + b.k; (* подразумевается, что декларация типа vector была произведена в схеме с именем this schema *) RETURN (vr); END_IF; END_IF; END_FUNCTION; В языке Express-G специальные символы для изображения правил, процедур и функций не оговорены.
|
СПБГУАП, Санкт-Петербург, 2011 год |