}
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)