реализовал PoC. как и сказано — передавать слайсы можно только в процедуры, которые принимают open array.

сделано не очень красиво, но я хотел по минимуму врезаться в кодоген. поэтому в кодогене добавлена отдельная процедурка в `DevCPV.ActualPar()`, а в DevCPB делается акробатика по переписыванию `SLICE(arr, beg, end)` в нечто типа: `SLICE(arr[beg], COMP(ASSERT((end >= beg) & (end <= LEN(arr)), inxTrap), end - beg))`. отдельная процедурка понадобилась затем, что кодоген такие компаунды не понимает, так что я использую компаунд чисто как контейнер для нод (анализаторы AST такие контейнеры понимают правильно).

как и полагается, если индексы — константы, и размер массива известен на стадии компиляции, то проверки будут сделаны на стадии компиляции, и в финальный код не попадут. это само собой получается за счёт constant folding.

присваивание слайсов не поддерживается. в смысле: `arr1 := SLICE(arr2, b, e)` распарзится, но потом компилятор обидится, потому что фича исключительно для параметров. опять же: сделать можно, но я не хочу.

в принципе, генерируемый код можно сделать получше, если более глубоко влезть в низкоуровневый кодоген, но я пока стараюсь его не трогать. тащемта, просто потому, что ещё не разбирался толком, как он работает в плане выделения регистров и прочего (общую картину я понимаю, но в нюансы не лазил).