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

Изтрито е съдържание Добавено е съдържание
м замяна на чужда езикова препратка
м Бот: Форматиране на ISBN; козметични промени
Ред 109:
Къринг е техника на промяна на логиката на изчисление от една функция, която приема множество от аргументи (или кортеж) към серия от функции, които приемат по точно един аргумент. В този случай за пример е дадена трансформация на функция за деление с произволно цяло число към функция за деление с точно определено цяло число.<syntaxhighlight lang="python">
>>> def divide(x, y):
... return x / y
 
>>> def divisor(d):
... return lambda x: divide(x, d)
 
>>> half = divisor(2)
Ред 368:
 
=== C# ===
Поддръжката на анонимни функции в [[C#]] се е задълбочила през различните версии на компилатора на езика. C # езикът v3.0 В, излязъл през ноември 2007 г. с .NET Framework-а v3.5, има пълна поддръжка на анонимни функции. В C # те се наричат „[[Https://en.wikipedia.org/wiki/Lambda calculus|ламбда изрази]]“(„lambda expressions“), следвайки първоначалната версия на анонимни функции, ламбда смятане(lambda calculus). Вижте [http://www.microsoft.com/download/en/details.aspx?id=7029 C# 4.0 спецификацията секцията 5.3.3.29], за повече информация. <blockquote>Ламбда изразите представляват анонимни функции, които съдържат изрази или последователност от оператори. Всички ламбда изрази</blockquote><blockquote>използват ламбда оператора =>, който може да се чете като „отива в“. Идеята за ламбда изразите в C# е заимствана от функционалните езици</blockquote><blockquote>(например Haskell, Lisp, Scheme, F# и др.). Лявата страна на ламбда оператора определя входните параметри на анонимната функция, а дясната страна представлява израз или последователност от оператори, която работи с входните параметри и евентуално връща някакъв резултат.<ref>Светлин Наков, Веселин Колев и колектив, [http://www.introprogramming.info/wp-content/uploads/2015/10/Intro-CSharp-Book-v2015.pdf "Въведение в програмирането със C# „]. Велико Търново, Фабер, 2011. <nowiki>ISBN 978-954-400-527-6</nowiki>. – глава 22, стр.922 – 928 </ref></blockquote><syntaxhighlight lang=“c#">
// <see href="http://msdn.microsoft.com/en-us/library/bb549151.aspx" />
Func<int,int> foo = x => x*x;
Ред 381:
var values = new List<int>() { 7, 13, 4, 9, 3 };
// Map the anonymous function over all elements in the list, return the new list
var foo = values.ConvertAll(d => d*d) ;
// the result of the foo variable is of type System.Collections.Generic.List<Int32>
</syntaxhighlight>
 
Предишните версии на C# са имали по-ограничена поддръжка на анонимните функции. C# v1.0, въвежда през февруари 2002 г. с .NET Framework v1.0, предоставянето на частична поддръжка на анонимните функции чрез използването на [[Https://en.wikipedia.org/wiki/Delegate (CLI)|делегати(delegates)]]. Тази конструкция е в известна степен подобНа на PHP делегатите. В C# 1.0, делегатите са като указатели на функции, които се отнасят до определен метод в рамките на един клас. (Но за разлика от PHP името не се изисква в момента на използване на делегата.)
C# v2.0, издаден през ноември 2005 г. с .NET Framework v2.0, въвежда концепцията за анонимни методи, като начин да пишат неименувани инлайн блокове изявление(inline statement blocks), които могат да бъдат изпълнени чрез
извикване на делегат(delegate invocation). C# 3.0 продължава да поддържа тези конструкции, но също така поддържа и експресивната ламбда конструкция.
 
Ред 427:
</source>
 
В случай, че версията на C# е 2.0, С# компилаторът взима блока код на анонимната функция и създава static private функция. Вътрешно, функцията получава генерирано име, разбира се, това генерирано име се основава на името на метода, в който се декларира делегат. Но името не е изложено в кода на приложението, освен с помощта на „reflection“
 
В случай, че версията на C# е 3.0, се прилага същия механизъм.<syntaxhighlight lang="javascript">
Ред 440:
</syntaxhighlight>В [[ES6]]:<syntaxhighlight lang="javascript">
alert((x => x*x)(10));
</syntaxhighlight>Тази технология се използва по-често в [[Bookmarklets]]. За пример, за да сменим заглавието на текущия документ (видим в главния бар на прозореца) в [[URL]], в следващата отметка може помогне.<syntaxhighlight lang="javascript">
javascript:document.title=location.href;
 
</syntaxhighlight>Въпреки това, като зададена задача връща (собственото URL), много браузъри създават нова страница, за да изведат тази стойност.
 
Вместо анонимна функция, която не връща стойност, може да се използва:<syntaxhighlight lang="javascript">
javascript:(function(){document.title=location.href;})();
</syntaxhighlight>Отчетът за функция в първата (външна) двойка скоби заявява анонимна функция, която след това се изпълнява, когато се използва с последната двойка скоби. Това е почти еквивалентна на следната информация, която е обкръжена с f за разлика от анонимна функция.<syntaxhighlight lang="javascript">
Ред 456:
 
=== Julia ===
В [[Julia]] програмирането анонимните функции са дефинирани с използването на синтаксиса<code>(arguments)->(expression)</code>,<syntaxhighlight lang="julia">
julia> f = x -> x*x; f(8)
64
Ред 464:
 
=== Lisp ===
[[Lisp]] и [[Scheme]] поддържат анонимните функции изпозвайки „ламбда“ конструкции, което е препратка към [[lambda calculus]]. <syntaxhighlight lang="lisp">
(lambda (arg) (* arg arg))
</syntaxhighlight>
Ред 481:
[[Clojure]] поддържа анонимни функции чрез „Fn“ в специална форма:<syntaxhighlight lang="clojure">
(fn [x] (+ x 3))
</syntaxhighlight>Има и синтаксис за определяне на ламбда:<syntaxhighlight lang="clojure">
# (+ % %2 %3) ; Defines an anonymous function that takes three arguments and sums them.
</syntaxhighlight>Също като Scheme, именуваните функции на Clojure са синтактична захар за анонимна функция, обвързана с имена:<syntaxhighlight lang="clojure">
(defn func [arg] (+ 3 arg))
</syntaxhighlight>се разширява, до:<syntaxhighlight lang="clojure">