Стили и методы программирования




Дополнительные возможности - часть 4


Для эффективной работы на Рефале это выражение нужно закодировать, используя структурные скобки. Кодом пары скобок Левая Правая будут скобки (Левая и Правая). Ниже дан алгоритм кодировки.

При записи данного алгоритма используется еще одна возможность Рефала-5. После образца через запятую может идти произвольное выражение, включающее свободные переменные образца, а затем другой образец. Во втором образце мы отождествляем вспомогательное выражение, не изменяя значений переменных, унаследованных из предыдущего образца. Если после второго образца идут фигурные скобки, то мы задаем безымянную функцию внутри функции. Если же их нет, то это отождествление рассматривается как дополнительное условие успешности первого отождествления. Эта иерархия вложенности может продолжиться на несколько уровней, причем переменные внешних уровней на внутренних уровнях остаются связанными, уже не изменяя значений.

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

$ENTRY Go{=<Init>;} $EXTRN Xxout; * Инициализация поля зрения и констант Init{=<Open 'r' 1 'Input.txt'><Trans <Acquire(<Get 1>)";} Acquire { e.Got ()= e.Got; * Конец ввода - пустая строка e.Got (e.New)=<Acquire e.Got e.New (<Get 1>)>; } Brackets {=('()')('[]')('')('<>');} Trans { e.A =<Result <Pairing () e.A > >; } Pairing { * В первой скобке содержится последовательность всех незакрытых * скобок вместе с сегментами данных, подлежащими помещению * в даннуюпару скобок; * каждый сегмент данных также заключен в скобки (e.Unclosed (e.LastUn)(s.Lbrack e.Middle)) s.Rbrack e.Last, <Brackets>: e.A(s.Lbrack s.Rbrack ) e.B = * Встретилась правая скобка, парная последней незакрытой; * выбрасываем отработанный сегмент из поля зрения <Pairing (e.Unclosed (e.LastUn (s.Lbrack e.Middle s.Rbrack))) e.Last>; ((s.Lbrack e.Middle)) s.Rbrack e.Last, <Brackets>: e.A(s.Lbrack s.Rbrack ) e.B = * Парная незакрытой, находящейся внутри другой незакрытой (s.Lbrack e.Middle s.Rbrack) <Pairing () e.Last>; (e.Unclosed (e.LastUn)(s.Lbrack e.Middle)) s.Rbrack e.Last, <Brackets>: e.A(s.Lbrack1 s.Rbrack ) e.B = * Непарные скобки <Prout "Brackets Mismatch!"> Error; (e.Unclosed ) s.Lbrack1 e.Last, <Brackets>: e.A(s.Lbrack1 s.Rbrack ) e.B = * Еще одна открывающая скобка; создаем новую группу данных <Pairing (e.Unclosed (s.Lbrack1)) e.Last>; () s.Lbrack e.Last, <Brackets>: e.A(s.Lbrack s.Rbrack ) e.B = * Первая открывающая скобка <Pairing ((s.Lbrack)) e.Last>; () s.Rbrack e.Last, <Brackets>: e.A(s.Lbrack s.Rbrack ) e.B = * Первая скобка - закрывающая <Prout "Extra right bracket"> Error; * Нейтральный символ вне скобок () s.Other e.Last = s.Other <Pairing () e.Last>; * Выражение и скобки исчерпаны - успех () =; * Выражение исчерпано, а скобки - нет (e.Unclosed (e.Lastun))=<Prout "Not all brackets are closed" Error; * Нейтральный символ в очередной скобке (e.Unclosed (e.Lastun))s.Other e.Last= <Pairing (e.Unclosed(e.Lastun s.Other)) e.Last>; } Result { * Если была ошибка, выйти e.A Error=; * Иначе вывести результат для дальнейшего использования e.A =<Xxout ('output.rdt') e.A>; }




Содержание  Назад  Вперед