Else break

}

n = n + v

}

}

На четвертом этапе применяется трансформация кодирования строки s вырезкой массива. При этом разные значения списка s представляются вырезками одного массива S. Для программы (7.38) необходимо кодировать начальное значение строки s и текущее, причем в начальный момент исполнения программы текущее значение устанавливается равным начальному. Начальное состояние - вырезка S[m..p], текущее - S[j..p]. Массив S и величины j, m, p должны быть определены в программе, причем j - переменная, а m и p могут быть константами.

type STR = array (char, M..N);

STR S;

int j = m;

Значения границ M и N должны быть достаточными, т. е. M ≤ m, p, j ≤ N. Операции со списком s кодируются следующим образом:

s = nil j > p

s.car → S[j]

s = s.cdr j = j + 1

Применение трансформации кодирования строки s к программе (7.38) дает итоговую программу на императивном расширении языка P.


type STR = array (char, M..N); (7.39)

STR S;

nat n = 0;

for (int j = m; ;) {

for (; ;) {

if (j > p) return

char e = S[j]; j = j + 1;

if (цифра(e)) break

}

nat v = val(e);

for (;j <= p;) {

char b = S[j]; j = j + 1;

if (цифра(b)) v = v * 10 + val(b)