2010-04-22 23 views
10

Czy ktoś może mi wyjaśnić wyrażenia lambda &, do czego mogą one być używane. Mam googleed na to & mieć przybliżony pomysł. większość przykładów podaje kod C#. A co z wyrażeń lambda w zwykłym starym C ...?Wyrażenia Lambda

+0

Po el.pescado poniżej, ponieważ C jest bardzo definitywnym imperatywem tworzenia anonimowej metody (funkcji) nie jest wykonywane. Najbliższe C pojawia się w anonimowych funkcjach poprzez wskaźniki funkcyjne, takie jak wskaźnik funkcji komparatora przekazywany do 'qsort (3)' (ale nie są tak naprawdę anonimowe, ponieważ muszą być zdefiniowane i nazwane). – msw

Odpowiedz

13

Istnieje rzeczywiście dwie rzeczy zwane „wyrażenia lambda”, które są dość luźno powiązane:

wyrażenia
  1. Lambda są fundamentalną częścią lambda calculus i są ściśle powiązane z funkcjonalną programowanie

  2. W językach imperatywnych wyrażenia lambda są zwykle synonimami metod anonimowych. W języku C#, na przykład można przekazać wyrażenie lambda jako argument (czyli takie samo wyrażenie, a nie tylko jej wynik.)

C#:

someCollection.Apply (x => 2*x); // apply expression to every object in collection 
// equivalent to 
someCollection.Apply (delegate (int x) { return 2 * X; }); 

Mimo, że C nie obsługuje metody anonimowe. Można jednak, wskaźniki funkcyjne użycie do osiągnięcia podobnych rezultatów:

int multiply (int x) 
{ 
    return 2 * x; 
} 

... 
collection_apply (some_collection, multiply); 
+1

Podobno Apple dodał coś do LLVM, aby dodać pewien rodzaj wyrażenia lambda do C (bloki kodu lub cokolwiek). Nie jest to jednak oficjalny standard i zapomniałem dokładnych terminów wyszukiwania. – ndim

+0

Bloki kodu są częścią Objective-C (której Apple używa w większości swoich bibliotek wyższego poziomu), która jest C z dodaną składnią OO. –

-1

Spójrz na MSDN

+1

C! = C++ (15chars) –

+0

Ostry, ale sprawiedliwy. (15 dokładnie) –

+0

Podejrzewałem, że miał na myśli C++, a nie C. Jasne założenie, które myślałem. – Chris

1

C nie obsługuje wyrażeń Lamba ... jeśli wiesz, Perl, bardzo polecam książki „Perl wyższego rzędu”, który daje świetne wprowadzenie do wszystkich technik programowania funkcjonalnego w znanym (jeśli wiesz, perl) i praktycznym otoczeniu.

2

Odpowiedź el.pescado jest słuszna, ale dostarczony przez niego przykład ma łatwą pracę przy użyciu wskaźnika funkcji. Wiele zastosowań funkcji lambda nie może być rozwiązanych za pomocą wskaźników funkcji c.

Say piszesz te funkcje w C:

int Multiply_1(int x) { return(x*1); } 
int Multiply_2(int x) { return(x*2); } 
int Multiply_3(int x) { return(x*3); } 
int Multiply_4(int x) { return(x*4); } 
etcetera, to infinity 

Ci są dość łatwe do zrozumienia. Załóżmy teraz, że chcesz napisać funkcję, która pobiera y jako wejście i zwraca wskaźnik do funkcji Multiply_y():

(int)(int) *Make_Multiplier(int y) { return(Multiply_y); } 

Gdzie „Multiply_y” jest dynamicznie utworzona funkcja postaci Multiply_1, Multiply_2, etc Języki posiadające pierwszorzędne funkcje lambda mogą to zrobić.

+0

Czy na pewno działa to w języku C? – pmb

+0

Mówię, że to nie działa w c. el.pescado stworzył bardzo prostą lambdę, ale stworzenie bardziej skomplikowanej nie jest możliwe. – Eyal

+0

Niestety nie jest to jasne, jeśli czytasz tylko tę odpowiedź. dzięki. – pmb