Ещё в старых Pascal/Delphi была поддержка "безтиповых" аргументов процедур вида "var v;", "const c;". А также есть и открытый массив вида "a: array of const". Последний есть runtime-решение, неявно компилятором используется универсальный вариантный тип для динамического массива (TVarRec, если память не изменяет). Вместо runtime можно попробовать реализовать статическое "инстанцирование", примерно в стиле (псевдо-Pascal):
## Код:
```
procedure work_tuple(s: string; args: array of const);
    procedure prepare;
    begin
        ...
    end;

    procedure finish;
    begin
        ...
    end;

    procedure work(a,,b: array of const); overload;
    var m: integer;
    begin
        ...
        // используем а, конкретный тип уже известен,
        // anyproc подбирается согласно типу, как обычно:
        m := a.anyproc(n);
        ...
        work(b); // b доступно только для передачи аргумента
    end;

    //будет вызвана при пустом массиве (конец рекурсии, в т.ч. при пустом массиве изначально)
    procedure work(); overload;
    begin
      ...  
    end;

begin
  prepare;
  work(args);
  finish;
end;

// применение:
var rec: SomeRecord;
...
work_tuple("any string", 1234, 45.5454, rec);

// с пустым массивом:
work_tuple("none");
```

В общем, вот такие "variadic"-аргументы. Или же при наличии в языке константных выражений для массивов использование становится таким же, как и оригинальный "array of const":
work_tuple("any string", [1234, 45.5454, rec]);

В объявлениях при наличии прочих, не "variadic"-аргументов, вроде бы, различимость присутствует:
procedure work(n,m: integer; head,,tail: array of const);

Возникает необходимость в правилах перегрузки процедур с учётом "variadic". Есть смысл организовать совместимость "variadic"-массива с прочими массивами, т.е. массив можно готовить предварительно (в runtime, как обычно в программном коде) и передавать процедуре.

Идентификация типа "головы" массива уже предопределяет дальнейшее использование (статика, виртуальные вызовы, тестирование типа и т.д., т.е. всё соответствует обычным положениям в языке). Возникает потребность в унификации "объектного" вызова, в т.ч. и для базовых встроенных типов аля "a.anyproc(...)" ("всё есть объект"), для чего необходима эквивалентность форм вызова:
## Код:
```
procedure anyproc(i, j: integer);
...
var n, m: integer;
...
anyproc(n, m);
n.anyproc(m);
```

Кроме массива напрашивается аналогичная поддержка и для одиночных "var v" с "const c" без типа (расширить с IN, OUT).
В идеале, при современном подходе, потенциальная реализация требует техники мономорфизации, чтобы код не разбухал.
Как-то так, в общем.