Кіріспе
Айнымалы санды аргументтері бар функция
Математика мен компьютерлік бағдарламалауда, айнымалы аргументтер функциясы – бұл белгісіз арлықты функция, яғни, өзгеретін санды аргументтерді қабылдайтын функция. Бағдарламалау тілдері арасында айнымалы аргументтер функциясын қолдау әртүрлі деңгейде. "Айнымалы аргументтер" термині 1936–1937 жылдары пайда болған, бірақ 1970-ші жылдарға дейін кеңінен қолданылмады.
Шолу
Көптеген математикалық және логикалық операциялар бар, олар табиғи түрде өзгергіш функциялар (variadic functions) ретінде кездеседі. Мысалы, сандарды қосу немесе жолдарды немесе басқа тізбектерді біріктіру операциялары кез келген сандағы аргументтерге қолданылатын операциялар болып саналады (бірақ бұл жағдайларда ассоциативтік қасиет формалды түрде қолданылса да). Көптеген тілдерде өзгергіш функция ретінде жүзеге асырылған тағы бір операция – шығыс форматындау. C функциясы және Common Lisp функциясы – осындай екі мысал. Екеуі де шығыстың форматын анықтайтын бір аргументті және форматталуға тиіс мәндерді ұсынатын кез келген сандағы аргументтерді қабылдайды. Өзгергіш функциялар кейбір тілдерде типтік қауіпсіздік мәселелерін тудыруы мүмкін. Мысалы, C-дегі `printf`, егер сақтықпен қолданылмаса, форматтық тізбек шабуылдары деп аталатын қауіпсіздік бұзушылықтарына әкелуі мүмкін. Бұл шабуылға тілдің өзгергіш функцияларды қолдауының типтік қауіпсіздігі болмауы себеп: ол функцияға стектен алынған аргументтер санын арттыруға мүмкіндік береді, бұл стекке нұқсан келтіріп, күтпеген әрекеттерге әкеледі. Осыған байланысты CERT координациялық орталығы C-дегі өзгергіш функцияларды жоғары деңгейдегі қауіпсіздік тәуекелі деп санайды. Функционалдық бағдарламалау тілдерінде өзгергіш функцияларды `apply` функциясына толықтыру ретінде қарастыруға болады, ол функцияны және тізім/рет/массивті аргументтер ретінде қабылдайды және функцияны сол тізімде берілген аргументтермен шақырады, осылайша функцияға өзгермелі сандағы аргументтерді жібереді. Функционалдық тіл Haskell-де өзгергіш функцияларды типтік кластың мәнін қайтару арқылы жүзеге асыруға болады; егер `instance` соңғы қайтарылатын мән және функция болса, бұл кез келген қосымша аргументтерге мүмкіндік береді. Терминді қайта жазу зерттеулеріндегі байланысты тақырып – хедждер немесе хеджтік айнымалылар. Өзгергіш функциялардан айырмашылығы, олар аргументтері бар функциялар, ал хедждер – аргументтердің тізбегі. Олар да шектеулерге ие болуы мүмкін (мысалы, «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 және FreePascal екеуі де сырттан жарияланған функциялардың формальды параметрлер спецификациясын эллипс белгісін қолдана отырып пайдалануына рұқсат береді.