В комп'ютерному програмуванні, анонімною функцією (інші назви функціональний літерал або лямбда-вираз, лямбда-функція) називається така функція, яка визначена без вказання з нею ідентифікатора. Анонімні функція зазвичай:
- передаються у вигляді аргументу у функції вищого порядку, або
- використовуються для побудови результату функції вищого порядку, яка має повертати функцію.
Якщо функція використовується в програмі лише раз, або обмежену визначену кількість раз, використання анонімної функції може бути більш синтаксично простішим ніж використання іменованої функції. Анонімні функції широко застосовуються у функціональних мовах програмування і інших мовах програмування з функціями першого класу, де вони виконують ту саму роль для функціонального типу, що і літерали для інших типів даних.
Анонімні функції були представлені в роботі Алонзо Черча як винайдене ним лямбда числення у 1936 (до появи електронно-обчислюваних машин), в якому всі функції анонімні. В деяких мовах програмування, анонімні функції оголошуються з використанням ключового слова lambda, а самі анонімні функції часто називаються лямбда абстракціями або лямбда виразами. Анонімні функції почали використовуватись в мовах програмування починаючи з мови Lisp в 1958 і тепер дедалі більше сучасних мов програмування підтримують анонімні функції.
Анонімні функції є формою вкладених функцій, в тому плані, що вони дозволяють доступ до змінних в зоні видимості функції, в яку вони вкладені (не локальні змінні). Це означає, що анонімні функції повинні визначатися з використанням замикань. На відміну від іменованих вкладених функцій, вони не можуть бути без використання (також називається анонімною фіксованою точкою або анонімною рекурсією).
Приклади
Багато мов програмування мають підтримку анонімних функцій, або чогось подібного.
C (не стандартне розширення)
Анонімні функції не підтримуються стандартним C, але підтримуються деякими його діалектами, такими як gcc і clang.
GCC
GCC має підтримку анонімних функцій, що є поєднанням вкладених функцій і . Вони мають таку форму:
( { return_type anonymous_functions_name (parameters) { function_body } anonymous_functions_name; } )
Даний приклад працює лише в проєктах, що компілюються GCC. Слід відмітити, що завдяки роботі макроса, якщо ваша 'l_body' матиме коми за межами дужок, тоді цей код не скомпілюється оскільки gcc використовує кому як роздільник для наступного аргументу макроса. Аргумент 'l_ret_type' можна прибрати, якщо доступне використання '__typeof__'; в наведеному прикладі використання __typeof__ для масиву поверне 'testtype *', який можна розіменувати для отримання фактичного значення, якщо це необхідно.
#include <stdio.h> //* це є визначення анонімної функції */ #define lambda(l_ret_type, l_arguments, l_body) \ ({ \ l_ret_type l_anonymous_functions_name l_arguments \ l_body \ &l_anonymous_functions_name; \ }) #define forEachInArray(fe_arrType, fe_arr, fe_fn_body) \ { \ int i=0; \ for(;i<sizeof(fe_arr)/sizeof(fe_arrType);i++) { fe_arr[i] = fe_fn_body(&fe_arr[i]); } \ } typedef struct __test { int a; int b; } testtype; void printout(const testtype * array) { int i; for ( i = 0; i < 3; ++ i ) printf("%d %d\n", array[i].a, array[i].b); printf("\n"); } int main(void) { testtype array[] = { {0,1}, {2,3}, {4,5} }; printout(array); /* анонімна функція задається як функція для foreach */ forEachInArray(testtype, array, lambda (testtype, (void *item), { int temp = (*( testtype *) item).a; (*( testtype *) item).a = (*( testtype *) item).b; (*( testtype *) item).b = temp; return (*( testtype *) item); })); printout(array); return 0; }
Див. також
Це незавершена стаття про мови програмування. Ви можете проєкту, виправивши або дописавши її. |
Ця стаття має кілька недоліків. Будь ласка, допоможіть удосконалити її або обговоріть ці проблеми на .
|
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V komp yuternomu programuvanni anonimnoyu funkciyeyu inshi nazvi funkcionalnij literal abo lyambda viraz lyambda funkciya nazivayetsya taka funkciya yaka viznachena bez vkazannya z neyu identifikatora Anonimni funkciya zazvichaj peredayutsya u viglyadi argumentu u funkciyi vishogo poryadku abo vikoristovuyutsya dlya pobudovi rezultatu funkciyi vishogo poryadku yaka maye povertati funkciyu Yaksho funkciya vikoristovuyetsya v programi lishe raz abo obmezhenu viznachenu kilkist raz vikoristannya anonimnoyi funkciyi mozhe buti bilsh sintaksichno prostishim nizh vikoristannya imenovanoyi funkciyi Anonimni funkciyi shiroko zastosovuyutsya u funkcionalnih movah programuvannya i inshih movah programuvannya z funkciyami pershogo klasu de voni vikonuyut tu samu rol dlya funkcionalnogo tipu sho i literali dlya inshih tipiv danih Anonimni funkciyi buli predstavleni v roboti Alonzo Chercha yak vinajdene nim lyambda chislennya u 1936 do poyavi elektronno obchislyuvanih mashin v yakomu vsi funkciyi anonimni V deyakih movah programuvannya anonimni funkciyi ogoloshuyutsya z vikoristannyam klyuchovogo slova lambda a sami anonimni funkciyi chasto nazivayutsya lyambda abstrakciyami abo lyambda virazami Anonimni funkciyi pochali vikoristovuvatis v movah programuvannya pochinayuchi z movi Lisp v 1958 i teper dedali bilshe suchasnih mov programuvannya pidtrimuyut anonimni funkciyi Anonimni funkciyi ye formoyu vkladenih funkcij v tomu plani sho voni dozvolyayut dostup do zminnih v zoni vidimosti funkciyi v yaku voni vkladeni ne lokalni zminni Ce oznachaye sho anonimni funkciyi povinni viznachatisya z vikoristannyam zamikan Na vidminu vid imenovanih vkladenih funkcij voni ne mozhut buti bez vikoristannya takozh nazivayetsya anonimnoyu fiksovanoyu tochkoyu abo anonimnoyu rekursiyeyu PrikladiBagato mov programuvannya mayut pidtrimku anonimnih funkcij abo chogos podibnogo C ne standartne rozshirennya Anonimni funkciyi ne pidtrimuyutsya standartnim C ale pidtrimuyutsya deyakimi jogo dialektami takimi yak gcc i clang GCC GCC maye pidtrimku anonimnih funkcij sho ye poyednannyam vkladenih funkcij i Voni mayut taku formu return type anonymous functions name parameters function body anonymous functions name Danij priklad pracyuye lishe v proyektah sho kompilyuyutsya GCC Slid vidmititi sho zavdyaki roboti makrosa yaksho vasha l body matime komi za mezhami duzhok todi cej kod ne skompilyuyetsya oskilki gcc vikoristovuye komu yak rozdilnik dlya nastupnogo argumentu makrosa Argument l ret type mozhna pribrati yaksho dostupne vikoristannya typeof v navedenomu prikladi vikoristannya typeof dlya masivu poverne testtype yakij mozhna rozimenuvati dlya otrimannya faktichnogo znachennya yaksho ce neobhidno include lt stdio h gt ce ye viznachennya anonimnoyi funkciyi define lambda l ret type l arguments l body l ret type l anonymous functions name l arguments l body amp l anonymous functions name define forEachInArray fe arrType fe arr fe fn body int i 0 for i lt sizeof fe arr sizeof fe arrType i fe arr i fe fn body amp fe arr i typedef struct test int a int b testtype void printout const testtype array int i for i 0 i lt 3 i printf d d n array i a array i b printf n int main void testtype array 0 1 2 3 4 5 printout array anonimna funkciya zadayetsya yak funkciya dlya foreach forEachInArray testtype array lambda testtype void item int temp testtype item a testtype item a testtype item b testtype item b temp return testtype item printout array return 0 Div takozhLyambda virazi u S Ce nezavershena stattya pro movi programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Cya stattya maye kilka nedolikiv Bud laska dopomozhit udoskonaliti yiyi abo obgovorit ci problemi na storinci obgovorennya Cya stattya mistit tekst sho ne vidpovidaye enciklopedichnomu stilyu Bud laska dopomozhit udoskonaliti cyu stattyu pogodivshi stil vikladu zi stilistichnimi pravilami Vikipediyi Mozhlivo storinka obgovorennya mistit zauvazhennya shodo potribnih zmin berezen 2018 Cyu stattyu treba vikifikuvati dlya vidpovidnosti standartam yakosti Vikipediyi Bud laska dopomozhit dodavannyam dorechnih vnutrishnih posilan abo vdoskonalennyam rozmitki statti berezen 2018 Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2018