Анонимна функция: Разлика между версии

Изтрито е съдържание Добавено е съдържание
м без   интервал
м без   интервал; козметични промени
Ред 9:
Ако дадена функция се използва само веднъж или ограничен брой пъти, е подходящо да бъде създадена като анонимна, тъй като това я прави синтактично по-лека, отколкото именувана функция. Във функционалните езици и други езици с функции от първи клас анонимните функции се използват навсякъде, където те изпълняват същата роля за вида на функцията, както правят литералите за други типове данни.
 
Произходът на анонимните функции е свързан с работата на [[Алонсо Чърч]] и неговата теория за [[ламбда смятане]], (създадена преди ерата на компютрите), в която всички функции са анонимни.<ref>Fernandez, Maribel (2009),&nbsp; [https://books.google.bg/books?id=FPFsnzzebhQC&pg=PA33&redir_esc=y#v=onepage&q&f=false ''Models of Computation: An Introduction to Computability Theory''], Undergraduate Topics in Computer Science, Springer Science & Business Media, p. 33, [[International Standard Book Number|ISBN]]&nbsp; [[%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D0%BD%D0%B8%3ABookSources/9781848824348|9781848824348]],&nbsp; <q>The Lambda calculus ... was introduced by Alonzo Church in the 1930s as a precise notation for a theory of anonymous functions</q></ref> В няколко програмни езика анонимните функции се представят чрез използването на ключовата дума ламбда, а анонимните функции често са посочени като ламбди или ламбда абстракции. Анонимните функции се въвеждат за пръв път в програмния език [[Lisp (език за програмиране)|Lisp]] през 1958 г. Оттогава непрекъснато се увеличава броя на съвременните езици, които поддържат анонимни функции.
 
Анонимните функции са форма на вложена функция, в която е позволен достъпа до променливи в обхвата на съдържащата функция. Ето защо анонимните функции трябва да бъдат имплементирани чрез използването на затваряне. За разлика от именуваните вложени функции, те не могат да бъдат рекурсивни без помощта на т.нар. оператор на неподвижната точка (т.нар. анонимна неподвижна точка или анонимна рекурсия).<ref>''[https://www.cs.cornell.edu/Courses/cs3110/2012sp/lectures/lec29-fixpoints/lec29.html "Lecture 29: Fixpoints and Recursions"]. CS3110 Spring 2012&nbsp; :: Data Structures and Functional Programming''. Cornell University – Computer Science. Посетен на 3 декември 2014.</ref>
 
== Приложение ==
Анонимните функции могат да се използват за съдържащи функционалност, които не се нуждаят от наименуване и имат възможност за&nbsp; използване за кратък период от време. Някои първични примери включват [[Затваряне (информатика)|затваряне]] и&nbsp; обработване.
 
Употребата на анонимните функции е въпрос на стил. Използването им никога не е единственият начин за решаване на проблем: всяка анонимна функция може да бъде дефинирана като именувана функция и наричана по име. Някои програмисти използват анонимните функции за капсулиране на специфични еднократни кодове, за да не се усложнява основния код с много едноредови нормални функции.
 
В някои програмни езици, анонимните функции често се имплементират за всяка специфична цел като свързващи събития за обратно извикване, или&nbsp; за представяне на функциите за конкретни стойности, което може да е по-ефикасно, по-четливо, и по-малко податливо на грешки от използваните&nbsp; по общи именувани функции.
 
Целият код в следващата секция е написан на [[Python]] 2.x (not 3.x).
Ред 69:
}
}
</syntaxhighlight>В&nbsp; този пример е деклариран функционалният интерфейс наречен IntegerMath. Ламбда изразите, които имплементират IntegerMath се предават на метода apply(), за да бъде изпълнен. Методи по подразбиране като swap дефинират методи за функции.
 
== Сортиране ==
При сортиране по нестандартен начин може да бъде по-лесно да се използва логическо сравнение в анонимна функция вместо да се създава именувана функция. Повечето езици позволяват&nbsp; създаването на сортираща функция, която имплементира алгоритъм за сортиране за различни обекти. Тази функция обикновено приема името произволна функция за сравнение, това е взимане на 2 обекта и функцията показва дали те са равни или единият е „по-голям“ или&nbsp;&nbsp; „по-малък“от другия (обикновено се връща отговор като отрицателно, нула, или положително число).
 
Сортиране на списък от низове по дължина на низа:<syntaxhighlight lang="python">
Ред 81:
</syntaxhighlight>Анонимната функция в примера е ламбда израз:<syntaxhighlight lang="python">
lambda x,y: cmp(...)
</syntaxhighlight>Анонимната функция приема два аргумента, х и у, и връща &nbsp;сравнението между тях използвайки вградена функция cmp(). Друг пример може да бъде сортиране на обекти в списък по името на техния клас (в Python всички имат клас):<syntaxhighlight lang="python">
>>> a = [10, 'number', 11.2]
>>> a.sort(lambda x,y: cmp(x.__class__.__name__, y.__class__.__name__))
Ред 93:
Затварянето в програмирането е такава функция, която запазва обектите дефинирани в нейната среда на видимост, поне докато те се използват или са реферирани. Затварянията обикновено се ползват в езици, в които функциите са обекти от първи клас, с други думи езици, които позволяват функции да бъдат аргументи, да бъдат връщани като резултат от други функции от по-висок ред, да бъдат запазвани като променливи, подобно на примитивни типове (напр. int или string).
 
В следващия пример чрез анонимна функция се сравнява стойността на входящата променлива х с дадена променлива &nbsp;"threshold":<syntaxhighlight lang="python">
def comp(threshold):
return lambda x: x < threshold
Ред 491:
 
=== Lua ===
В Lua всички функции са анонимни. "Именуваната функция " в Lua е просто една променлива, която държи референция към обектна функция. <ref>[http://www.lua.org/pil/6.html "Programming in Lua – More and Functions"]. &nbsp;[http://web.archive.org/web/20080514220940/http://www.lua.org/pil/6.html Архивирано] от оригинала на 14 май 2008. Посетен на 25 април 2008.</ref>
 
По този начин в Lua:<syntaxhighlight lang="lua">