1.8.1. СКВОЗНОЙ ПРОСМОТР ВЫРАЖЕНИЙ Рассмотрим несколько примеров, демонстрирующих полезность функций, выдающих несколько результатов.
Предположим, что требуется определить функцию
NMB, заменяющую все символы выражения на их порядковые номера. Например<NMB A (B A) C A> => 1 (2 3) 4 5
Основная трудность здесь заключается в том, что встретив пару скобок, функция не знает заранее, сколько символов находится внутри скобок, а эта информация нужна, чтобы продолжить обработку "хвоста" выражения, стоящего после скобок. Поэтому функция, нумерующая символы должна иметь два аргумента: выражение, подлежащее обработке, и номер, который следует приписать первому символу, который встретится. Эта же функция должна выдавать два результата: обработанное выражение и первый "неиспользованный" номер символа. Таким образом, мы приходим к следующему определению функции NMB (использующему две вспомогательные функции NMB-Exp и NMB-Term):$func NMB e.Exp = e.Exp;
$func NMB-Exp e.Exp sN = e.Exp sN;
$func NMB-Term t.Exp sN = t.Exp sN;
NMB e.Exp =
<NMB-Exp e.Exp 1> :: e.Exp s,
e.Exp;
NMB-Exp e.Exp sN =
e.Exp :
{
= sN;
tX e.Rest =
<NMB-Term tX sN> :: tX sN,
<NMB-Exp e.Rest sN> :: e.Rest sN,
tX e.Rest sN;
};
NMB-Term tX sN =
tX :
{
s =
sN <"+" sN 1>;
(eE) =
<NMB-Exp eE sN> :: eE sN,
(eE) sN;
};