Функция BlockOper осуществляет взаимосвязь между блоком редактирования и общим архивом, а также позволяет управлять порядком чтения строк из входного файла редактирования, установкой курсоров по входной строке и по таблице контекстов. Системная текстовая переменная retBlockOper (код возврата) равна false в случае ошибки, иначе - true.

BlockOper (<операция>,<блок чтения>, <блок записи>,
            <диапазон строк чтения>, <диапазон строк записи>,
            <признак записи блока в файл>,
            <признак игнорирования пустых строк>)
<операция>:

save  -  сохранение строк блока редактирования (блок чтения) в
         ячейке общего архива (блок записи);

repl  -  замена строк в блоке записи на блок чтения;

insb  -  вставка строк блока чтения перед строками блока записи;

inse  -  вставка строк блока чтения после строк блока записи;

del   -  удаление строк блока редактирования (по умолчанию удаляется
         весь блок);

add   -  добавление строк в блок редактирования (строки  добавления
         определяются параметром блока чтения);

coll  -  слияние строк блока редактирования (по умолчанию сливается
         весь блок);

reted -  переход по таблице контекстов из текущего блокового
         контекста на блоковый контекст, номер которого указан в
         четвертом параметре блоковой функции, причем на вход
         вызываемому блоковому контексту подаётся входная строка,
         к началу которой добавлены все строки, содержащиеся в блоке
         редактирования, возврат из нового блокового контекста
         производится на следующую ячейку таблицы основного блокового
         контекста; например, BlockOper(reted,,,5);

retbl -  рекурсия по текущему блоковому контексту таблицы контекстов,
         номер которого указывается в параметре, причём на вход
         подаётся строка, отредактированная на прошлом шаге итерации
         (эта строка берётся из блока редактирования);
         например, BlockOper(retbl,,,3);

brk   -  прерывание поиска контекстов по файлу редактирования после
         того, как найден блок редактирования, в котором находится
         контекст замены (выполненная в блоке редактирования редакция
         заносится в выходной файл); например, BlockOper(brk) ;

brkbl -  прерывание рекурсии текущего блока и установка курсора на
         ячейку таблицы, стоящую за строкой входа в итерационный цикл
         по операции retbl, а если такой ячейки таблицы нет, то на
         начало таблицы контекстов (принудительно изменить установку
         курсора можно операцией setcn);
         например, BlockOper(brkbl,,,11) ;

setln -  позиция указателя по входному файлу:
         -сдвиг  от текущего значения при чтении очередной строки
          исходного файла редактирования на n (n>=1) строк вверх
          (по умолчанию на одну строку вверх);
         -сдвиг строки чтения на число строк в блоке редактирования 
          (при n=#), т.е. к началу текущей входной строки
          добавляются все строки из блока редактирования;
          например, BlockOper(setln,,,2), BlockOper(setln,,,#);

setst -  позиция указателя для найденного контекста:
         -установка указателя на n-ю позицию строки (для n без
          знака); 
         -сдвиг указателя по строке файла редактирования на n
          символов от конца найденного контекста поиска (при -n
          к началу строки, при +n к концу строки, при n=-0 сдвиг
          на начало строки, при n=+0 за пределы строки);
         -игнорирование найденного контекста при n=0  (по умолчанию),
          в этом  случае контекст считается ненайденым и курсор не
          изменяет своего значения;
          например, BlockOper(setst), BlockOper(setst,,,-2);
          Замечание.  Если необходимо в ячейке Таблицы контекстов
          произвести действия "поиск-замена" без изменения позиции
          указателя по строке, то в качестве контекста поиска следует
          задать {?}, а в контексте замены  использовать блоковую
          функцию #[… BlockOper(setst) …], однако, если курсор может
          стоять на конечном символе строки \0d и при дальнейшем
          поиске не должна читаться следующая входная строка, то в
          качестве контекста поиска следует задать {\0d?};    

setcn -  позиция указателя по таблице контекстов:
         -установка указателя на n-ю (n>=1) ячейку таблицы
          контекстов;
         -сдвиг указателя по таблице контекстов на n ячеек от
          текущего значения (при -n к началу таблицы, при +n к
          концу таблицы);
         -сохранение текущего указателя по таблице для следующего
          шага редактирования при n=0 (по умолчанию);
         -установка указателя на ячейку таблицы контекстов для
          "нестандартного" возврата из блока редактирования nblk,
          если он был вызван из другого блока редактирования
          оператором BlockOper(reted,,,nblk); стандартно возврат
          из блока производится на ячеку, следующую за оператором
          вызова, а для изменения этого порядка следующим параметром
          после setcn необходимо указать параметр return и этот
          оператор должен находиться в конечной конструкции '%$'
          блока редактирования nblk;
          например, BlockOper(setcn), BlockOper(setcn,,,+5),
          BlockOper(setcn,return,,-4);
<блок чтения>:
{10}      -  блок редактирования (10 - стандартный номер);
{{n}}     -  ячейка с номером n=1,2,… из общего архива;
sysvar[n] -  системная переменная (n=1,2,3…);
" … "     -  явно заданный контекст чтения (если содержит пробел,
            запятую, закрывающие круглую или квадратную скобку,
            то заключается в двойные кавычки);
<блок записи>:
{10}      -  блок редактирования (10 - стандартный номер);
{{n}}     -  ячейка с номером n=1,2,… из общего архива;
sysvar[n] -  системная переменная (n=1,2,3…);
" … "     -  явно заданный контекст чтения (если содержит пробел,
            запятую, закрывающие круглую или квадратную скобку,
            то заключается в двойные кавычки);
<диапазон строк чтения>:
n        -  номер строки блока чтения или записи (при отрицательном 
            значении номера отсчет строк идет от конечной строки
            блока:  -1 – последняя,  -2 – предпоследняя и т.д.);
n1..n2   -  диапазон строк блока чтения или записи (значение по
            умолчанию 1..-1);
fname    -  системное или полное имя файла с лексемами, которые
            являются диапазонами строк блока чтения или записи
            (системные файловые имена: sysfile, sysfile1, sysfile2);
<диапазон строк записи>:
n        -  номер строки блока чтения или записи (при отрицательном 
            значении номера отсчет строк идет от конечной строки
            блока:  -1 – последняя,  -2 – предпоследняя и т.д.);
n1..n2   -  диапазон строк блока чтения или записи (значение по
            умолчанию 1..-1);
fname    -  системное или полное имя файла с лексемами, которые
            являются диапазонами строк блока чтения или записи
            (системные файловые имена: sysfile, sysfile1, sysfile2);
<признак записи блока в файл>  - 
если задано true, то результат выполнения блоковой функции заносится
в выходной файл редактирования, начиная со следующей позиции после 
конечного строкового указателя и без коррекции этого указателя, если
задано true1, то производится аналогичная запись с коррекцией
конечного указателя, если задано false (значение по умолчанию), то
запись блока в файл не производится; 
Замечание.  Если блок редактирования записывается в файл и его
последняя строка совпадает с входной строкой {0}, отредактированной
на момент записи блока, то запись этой входной строки в файл в
дальнейшем не происходит.
<признак игнорирования пустых строк>  -
если задано true, то пустые строки исключаются из блока
редактирования, если задано false (значение по умолчанию), то
пустые строки блока сохраняются, запись в файл производится после
обработки этого параметра.
Обращение к функции: Комментарий:
=============================================================
BlockOper(save,{10},{{1}}) сохранение блока редактирования {10} в первой ячейке общего архива {{1}};
=============================================================
BlockOper(del,{10},0,1..-2) удаление из блока редактирования {10} диапазона строк от первой до предпоследней ( 1..-2 );
=============================================================
BlockOper(setln) возврат на одну строку чтения вверх по входному файлу редактирования;
=============================================================
BlockOper(setcn,0,0,11) дальнейший поиск контекстов по входной строке начнется с контекста из 11-й ячейки таблицы контекстов;
=============================================================
BlockOper(repl,{10},{10},,,True) запись блока редактирования {{10}} (после его изменения) в выходной файл;
=============================================================
BlockOper(insb,{{1}},{10},0,&1|sysfile ) вставка перед строкой блока редактирования {{10}} c номером, определяемым первой лексемой первой строки из системного файла sysfile, содержимого первой ячейки общего архива {{1}};
=============================================================
|3[...]|%$$                      //контекст
                                         поиска
#[BlockOper(reted,,,24)] //контекст
                                            замены
|3[...]|%$
. . . . . . .
уход с возвратом из блока редактирования |3| в блок редактирования |24|, возврат происходит на ячейку таблицы контестов стоящую следом за ячейкой с обращением;
=============================================================
|20[...]|%$                      //контекст
                                         поиска
#[BlockOper(retbl,,,20)]  //контекст
                                            замены
рекурсия по текущему блоку редактирования, т.е. следующий контекст поиска начнется с ячейки таблицы контекстов, в которой находится начало текущего условного блокового контекста с номером |20|;
=============================================================