3.7. COMPARE: СРАВНЕНИЕ ВЫРАЖЕНИЙ

$func? "=" (e.Exp1)(e.Exp2) = ;

$func? "/=" (e.Exp1)(e.Exp2) = ;

$func? ">=" (e.Exp1)(e.Exp2) = ;

$func? ">" (e.Exp1)(e.Exp2) = ;

$func? "<=" (e.Exp1)(e.Exp2) = ;

$func? "<" (e.Exp1)(e.Exp2) = ;

Эти функции сравнивают два выражения e.Exp1 и e.Exp2 и проверяют, выполнено ли между ними соответствующее отношение : "=" - равно, "/=" - не равно, ">=" - больше или равно, ">" - больше чем, "<=" - меньше или равно, "<" - меньше чем.

Если условие выполнено, результат работы - пусто, иначе - $fail(0).

$func COMPARE (e.Exp1)(e.Exp2) = s.Res; /* '<', '>', '=' */

COMPARE сравнивает два выражения e.Exp1 и e.Exp2. Результатом является:

'<', если e.Exp1 меньше чем e.Exp2,

'>', если e.Exp1 больше чем e.Exp2,

и '=', если e.Exp1 равно e.Exp2.

Объектные выражения сравниваются в соответствии со следующим отношением линейного порядка <.

Для любых двух выражений Oe' и Oe'' всегда либо Oe'<Oe'', либо Oe'=Oe'', либо Oe''<Oe'.

Два выражения Oe' = Ot1' ... Otm' и Oe'' = Ot1'' ... Otn'' сравниваются лексикографически, т.е. составляющие их термы сравниваются попарно слева направо, пока не будет найдена пара неравных термов Otk' и Otk''. Если при этом Otk' < Otk'', то считается, что

Oe' < Oe''.

Если окажется, что Oe' короче, чем Oe'' и все термы из Oe' равны соответствующим термам из Oe'', то считается, что Oe' < Oe''.

Более формально: для любых объектных выражений Oe, Oe', Oe'' и любых объектных термов Ot, Ot', Ot'' выполнено следующее.

Если Oe' < Oe'', то Ot Oe' < Ot Oe''.

Если Ot' < Ot'', то Ot' Oe' < Ot'' Oe''.

[] < Ot Oe.

где через [] обозначено пустое объектное выражение.

Для объектных термов отношение порядка определяется следующим образом.

Все символы предшествуют термам вида (Oe), т.е. всегда Os < (Oe).

Сравнение термов вида (Oe) сводится к сравнению их содержимого, т.е.:

Если Oe' < Oe'', то (Oe') < (Oe'').

Каждый символ принадлежит одному и только одному из следующих множеств:

символы-литеры

символы-слова

символы-числа

ссылки на ящики

ссылки на векторы

ссылки на строки

ссылки на таблицы

Эти множества мы будем называть типами символов. Если два символа принадлежат одному и тому же типу, они называются однотипными, в противном случае - разнотипными. Мы считаем что на множестве типов определено отношение порядка, и что типы были перечислены выше в порядке возрастания, т.е. множество символов-литер предшествует множеству символов-слов и т.д.

Если два символа Os' и Os'' принадлежат двум различным типам Type' и Type'', и при этом Type' < Type'', то считается, что Os' < Os''.

Однотипные символы сравниваются следующим образом. Символы-литеры упорядочены в соответствии с их кодами ASCII. Символы-слова преобразуются в цепочки символов-литер, соответствующие изображениям слов, а эти цепочки сравниваются как описано выше.

Символы-числа сравниваются в соответствии с естественным порядком на множестве чисел. Отношение порядка на множествах ссылок на ящики, векторы, строки и таблицы зависит от реализации.