Re: Refal for BESM-6


Subject: Re: Refal for BESM-6
From: Arkady Klimov (arkady.klimov@supercompilers.com)
Date: Tue Feb 27 2001 - 14:42:56 MSK


----- Original Message -----
From: Sergei Romanenko <roman@integrum.ru>
To: <leob@shell7.ba.best.com>
Cc: Andrei Klimov <andrei.klimov@supercompilers.com>; Arkady Klimov <Arkady.Klimov@supercompilers.com>
Sent: Tuesday, February 27, 2001 12:27 PM
Subject: Re: Refal for BESM-6

|
|
| > И еще такой простой вопрос: как на Рефале-5 пишется то, что на Рефале-2
| > было
|
| > * Отождествление справа налево, E2 не содержит пробелов
| > (R) E1 ' ' E2 = (E1) E2
|
| На вопросы по Рефалу-5, наверное, может ответить Аркадий Климов.
|
| Сергей
|
|
Точнее, я заведомо могу ответить на вопрос, как это сделать в Рефале-6,
а по рефалу-5 только предположительно.

В рефалах 6 и 5 нет отождествления справа (не то, чтобы это было принципиальное
решение, но наверно, было отсечено как лишнее и не очень нужное).
Но есть возможность писать доп. условия.
Например, вы пишете сначала предикат, проверяющий наличие символа в выражении:
OneOf {
        sA e1 sA e2 = T;
        sA e1 = T;
        };

Что-то в этом роде всегда присутствует в моей личной библиотечке.
Теперь можно написать:
........
        e1 ' ' e2, <OneOf ' ' e2>:F = ...

Естественно, тут не будет никакой оптимизации типа того, чтобы поиск пробела выполнялся справа, а не слева.

Написанное выше будет работать в обоих рефалах (6 и 5), только в 5 может понадобится вставить точки в переменные: e.1 s.A и т.п.
Поскольку в Рефале 6 есть откатные функции, то там я бы сделал чуть иначе:

OneOf sA e1 eA e2; // Выдается неуспех, если нет повторного вхождения первого символа sA.
......
    e1 ' ' e2 , #<OneOf ' ' e2> = ... // Знак # перед образцом или перед результатным выражением означает отрицание: успех
превращается в неуспех и наоборот.

А можно и не создавать вспомогательную функцию:

    e1 ' ' e2 , e2 : # e3 ' ' e4 =

Аркадий.



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD