Где есть? Если нет на Обероне, в крайнем случае подойдёт на каком-нибудь родственном языке. Сразу для тех, кто скажет, что это нельзя сделать на Обероне. Делается так: заводится тип "вариант" (обычно он есть в Оберонах, в A2/ЯОС их штуки 3, наверное, тут описывалhttps://tvoygit.ru/budden/ja-o-s/src/branch/главная/док/язык-и-библиотека/динамически-типизированный-укль-и-вариантные-типы.md ), и конструкторы для него. Далее создаётся массив аргументов. В A2/ЯОС это можно (наверное) сделать через конструктор мат. массивов, будет как-то так:
## Код:
```
MODULE Пример;
IMPORT Вариант;

VAR Аргументы : ARRAY 2 OF Вариант.Вариант;
BEGIN
IF этоA2 OR этоЯОС THEN
    Аргументы := [В.Ц(5),В.С("абв")]; // A2/ЯОС, если возможен мат.массив указателей или записей
ELSE
    Аргументы[0] := В.Ц(5);
    Аргументы[1] := В.С("абв") END;
printf("форматный вывод %d, %s",Аргументы) ENDIF END Пример.
```


В более продвинутой реализации можно сделать и функцию с произвольными аргументами. В A2/ЯОС уже есть встроенная процедура TRACE, в которой уже встроен механизм произвольных аргументов, разбираемых во время компиляции, и я уже освоил клонирование этого механизма, когда делал процедуру пПиши (одна из частей реализации тутhttps://tvoygit.ru/budden/ja-o-s/src/co ... .Mod#L6376, но в целом реализация размазана по всему компилятору ) . Мне нужен только лишь механизм разбора форматной строки.