> -- Александр Ильин писал(а):
> Но стандартная процедура COPY копирует строку не целиком, а до нулевого символа.

Ну и не используйте ее, если она заточена под сишные убогие строки

> -- Александр Ильин писал(а):
> Присваивание "a := b" копирует целиком, но работает только при условии, что a и b одного типа. Если b получено в процедуру как open array, т.е. без указания типа, присваивание невозможно, остаётся либо COPY, либо самописанный цикл.

Дык, кто мешает написать свою Strings.Assign? Чтобы не писать цикл и чтобы не использовать COPY?

> -- Александр Ильин писал(а):
> Конкатенации строк (+) в Обероне[-2] вообще нет.

Аналогично. В библиотеку. Хотя, конечно, без перегрузки операторов грустно, но оберонщики сами хотели все писать явно

> -- Александр Ильин писал(а):
> Видите, переменная-результат не , а  иметь достаточный размер. Если я не хочу трэпа, а хочу заранее убедиться в таком предусловии или даже выделить нужную память - как мне следует поступить?

Забить на статические массивы и использовать нормальные динамические строкиВ библиотеке. Как это сделали в C++

> -- Александр Ильин писал(а):
> У пользователя такой библиотеки будет возникать вопрос - в каком случае что использовать.

Все будет нормально, если пользователю дать четкую и простую концепцию, без всяких оговорок про нулевые символы.

> -- Александр Ильин писал(а):
> Есть ещё один немаловажный аспект, о котором пишет Сполски, - производительность. Гораздо дешевле размещать контейнеры фиксированного размера в стеке, чем динамической длины в куче. Здесь Оберон/КП перекладывают принятие решений на разработчика: критичные по быстродействию вещи лучше написать без динамической памяти.

Ну и как часто вам приходится писать критические по быстродействию вещи?Лично мне, например, "ускорять" строковые операции за счет отказа от динамической памяти пришлось только один раз. Это в C++, где динамическая память тормозная. А в языках с нормальным GC, выделение памяти в куче - это несколько процессорных инструкций...