2010-04-22 14 views
10

Qualcuno può spiegarmi espressioni lambda & per cosa possono essere utilizzati. Ho cercato su google & un'idea approssimativa. la maggior parte degli esempi fornisce il codice C#. Che ne dici delle espressioni lambda nella semplice vecchia C ...?Lambda Expressions

+0

Di seguito el.pescado di seguito, poiché C è decisamente una creazione imperativa del linguaggio del metodo anonimo (funzione) non eseguita. La C più vicina alle funzioni anonime è attraverso i puntatori di funzioni come il puntatore della funzione comparatore passato a 'qsort (3)' (ma non sono realmente anonimi in quanto devono essere definiti e quindi denominati). – msw

risposta

13

In realtà ci sono due cose chiamate "espressioni lambda", che sono piuttosto liberamente collegati:

  1. lambda espressioni sono parte fondamentale della lambda calculus e sono strettamente correlati alla funzionalità programmazione

  2. In lingue imperative, le espressioni lambda sono in genere sinonimi di metodi anonimi. In C#, ad esempio, è possibile passare espressione lambda come argomento (ovvero l'espressione stessa, non solo il suo risultato.):

C#:

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

Detto questo, C non supporta metodi anonimi. È possibile, tuttavia, i puntatori a funzione utilizzo per ottenere risultati simili:

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

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

Presumibilmente, Apple ha aggiunto qualcosa a LLVM per aggiungere un tipo di espressione lambda a C (blocchi di codice o sth). Tuttavia, non è uno standard ufficiale e ho dimenticato i termini esatti di ricerca. – ndim

+0

I blocchi di codice fanno parte di Objective-C (che Apple utilizza per la maggior parte delle sue librerie di livello superiore), che è C con una sintassi OO aggiunta. –

-1

Guardate qui sul MSDN

+1

C! = C++ (15 carati) –

+0

Duro ma giusto. (Esattamente 15) –

+0

Ho intuito che intendeva C++ non C. Giusto presupposto ho pensato. – Chris

1

C non supporta le espressioni Lamba ... se sai perl, consiglio vivamente il libro "ordine superiore perl", che vi darà una ottima introduzione a tutti i tipi di tecniche di programmazione funzionale in un ambiente familiare (se si conosce perl) e pratico.

2

La risposta di el.pescado è giusta, ma l'esempio che fornisce fornisce un semplice aggiramento, utilizzando un puntatore a funzione. Molti usi delle funzioni lambda non possono essere risolti con i puntatori di funzione di c.

Dire che si scrive queste funzioni in 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 

Quelli sono tutti abbastanza facile da capire. Ora si supponga di voler scrivere una funzione che prende y come input e restituisce un puntatore alla funzione Multiply_y():

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

Dove "Multiply_y" è una funzione creata dinamicamente della forma di Multiply_1, Multiply_2, ecc Le lingue con funzioni lambda di prima classe possono farlo.

+0

Sei sicuro che funzioni in C? – pmb

+0

Sto dicendo che non funziona in c. el.pescado ha fatto un lambda molto semplice ma per renderlo più complicato non è possibile. – Eyal

+0

scusa non è chiaro se leggi solo questa risposta. Grazie. – pmb

Problemi correlati