Введение
Функция с переменным числом аргументов
В математике и в программировании вариадическая функция — это функция неопределённой арности, то есть функция, принимающая переменное число аргументов. Поддержка вариадических функций существенно различается в разных языках программирования. Термин «вариадический» является неологизмом, появившимся в 1936–1937 годах. Широкое распространение термин получил в 1970-х годах.
Обзор
Существует множество математических и логических операций, которые естественно представляются в виде вариадических функций. Например, суммирование чисел или конкатенация строк и других последовательностей — это операции, которые можно рассматривать как применимые к любому числу операндов (хотя формально в этих случаях применяется ассоциативное свойство). Другой операцией, реализованной как вариадическая функция во многих языках, является форматирование вывода. Функции `printf` в C и `format` в Common Lisp — два таких примера. Обе принимают один аргумент, определяющий формат вывода, и любое количество аргументов, предоставляющих значения для форматирования. Вариадические функции могут вызывать проблемы с типобезопасностью в некоторых языках. Например, `printf` в C, при неосторожном использовании, может привести к классу уязвимостей, известных как атаки на строки форматирования. Атака возможна, поскольку языковая поддержка вариадических функций не является типобезопасной: она позволяет функции пытаться извлечь из стека больше аргументов, чем было туда помещено, что приводит к повреждению стека и непредсказуемому поведению. В связи с этим, CERT Coordination Center рассматривает вариадические функции в C как серьезную угрозу безопасности. В функциональных языках программирования вариадики можно рассматривать как дополнение к функции `apply`, которая принимает функцию и список/последовательность/массив в качестве аргументов и вызывает функцию с аргументами, содержащимися в этом списке, тем самым передавая переменное количество аргументов функции. В функциональном языке Haskell вариадические функции могут быть реализованы путем возвращения значения типа класса `Proxy`; если экземпляры `Proxy` являются окончательным возвращаемым значением и функцией, то это позволяет использовать любое количество дополнительных аргументов. Связанная область в исследованиях переписывания термов называется хеджированием или хеджирующими переменными. В отличие от вариадиков, которые являются функциями с аргументами, хеджирование — это последовательность самих аргументов. Они также могут иметь ограничения (например, «не более 4 аргументов») вплоть до фиксированной длины (например, «принимать ровно 4 аргумента»), поэтому называть их вариадическими может быть вводящим в заблуждение. Однако они относятся к одному и тому же явлению, и иногда терминология смешивается, что приводит к таким названиям, как вариадическая переменная (синоним хеджирования). Обратите внимание на двойное значение слова «переменная» и разницу между аргументами и переменными в функциональном программировании и переписывании термов. Например, терм (функция) может иметь три переменные, одна из которых является хеджирующей, что позволяет терму принимать три или более аргументов (или два или более, если хеджирование может быть пустым).
A related subject in term rewriting research is called hedges, or hedge variables. Unlike variadics, which are functions with arguments, hedges are sequences of arguments themselves. They also can have constraints ('take no more than 4 arguments', for example) to the point where they are not variable length (such as 'take exactly 4 arguments') thus calling them variadics can be misleading. However they are referring to the same phenomenon, and sometimes the phrasing is mixed, resulting in names such as variadic variable (synonymous to hedge). Note the double meaning of the word variable and the difference between arguments and variables in functional programming and term rewriting. For example, a term (function) can have three variables, one of them a hedge, thus allowing the term to take three or more arguments (or two or more if the hedge is allowed to be empty).
В Паскале
Паскаль стандартизован стандартами ISO 7185 («Standard Pascal») и 10206 («Extended Pascal»). Ни одна из стандартизированных форм Паскаля не поддерживает функции с переменным числом аргументов, за исключением некоторых встроенных процедур (/ и /, а также в EP (Extended Pascal) /). Тем не менее, диалекты Паскаля реализуют механизмы, напоминающие функции с переменным числом аргументов. Delphi определяет тип данных, который может быть связан с последним формальным параметром. Внутри определения функции это является массивом вариантов записей. Член вышеупомянутого типа данных позволяет проверять тип данных аргумента и выполнять соответствующую обработку. Компилятор Free Pascal также поддерживает функции с переменным числом аргументов Delphi. Однако эта реализация технически требует хотя бы один аргумент, поскольку Паскаль накладывает ограничение, что массивы должны быть однородными. Это требование обходится с помощью вариантных записей. GNU Pascal определяет спецификацию формальных параметров с переменным числом аргументов, используя многоточие (...), но по состоянию на 2022 год не был определен переносимый механизм для ее использования. И GNU Pascal, и Free Pascal позволяют внешне объявленным функциям использовать спецификацию формальных параметров с переменным числом аргументов, используя многоточие (...).