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;

};