2010-04-22 8 views
10

¿Alguien me puede explicar las expresiones lambda & para qué se pueden usar? He buscado en Google & tengo una idea aproximada. la mayoría de los ejemplos dan código C#. ¿Qué hay de las expresiones lambda en el viejo C ...?Lambda Expressions

+0

A continuación, el.pescado a continuación, ya que C es definitivamente una creación imperativa de lenguaje de método anónimo (función) no está hecho. Lo más cerca que C llega a las funciones anónimas es a través de indicadores de función como el puntero de función del comparador pasados ​​a 'qsort (3)' (pero no son realmente anónimos ya que necesitan ser definidos y nombrados así). – msw

Respuesta

13

En realidad, hay dos cosas que se llaman "expresiones lambda", que son más bien vagamente relacionados:

expresiones
  1. Lambda son parte fundamental de lambda calculus y están estrechamente relacionados con funcionales programación

  2. En idiomas imperativos, las expresiones lambda son generalmente sinónimos de métodos anónimos. En C#, por ejemplo, puede pasar a la expresión lambda como un argumento (es decir, una expresión en sí, no sólo su resultado.):

C#:

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

Una vez dicho esto, C no soporta métodos anónimos. Puede, sin embargo, los punteros de función utilidad para lograr resultados similares:

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

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

Supuestamente, Apple ha agregado algo a LLVM para agregar un tipo de expresión lambda a C (bloques de código o sth). No es un estándar oficial, sin embargo, y he olvidado los términos de búsqueda exactos. – ndim

+0

Los bloques de código son parte de Objective-C (que Apple usa para la mayoría de sus bibliotecas de nivel superior), que es C con una sintaxis de OO añadida. –

-1

Mire aquí en la MSDN

+1

C! = C++ (15chars) –

+0

Duro pero justo. (15 exactamente) –

+0

Supuse que se refería a C++, no a C. Justo asunción, pensé. – Chris

1

C no soporta expresiones Lamba ... si sabe Perl, le recomiendo el libro "Perl orden superior", que le dará una una excelente introducción a todo tipo de técnicas de programación funcional en un entorno familiar (si sabes perl) y práctico.

2

la respuesta de el.pescado es correcta, pero el ejemplo que proporciona tiene un trabajo fácil, utilizando un puntero a la función. Muchos usos de las funciones lambda no se pueden resolver con los punteros de función de c.

Decir que escribe estas funciones en 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 

Esos son todos bastante fácil de entender. Ahora supongamos que desea escribir una función que toma y como entrada y devuelve un puntero a la función Multiply_y():

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

Donde "Multiply_y" es una función dinámica creada de la forma de Multiply_1, Multiply_2, etc. Los lenguajes que tienen funciones lambda de primera clase pueden hacer eso.

+0

¿Estás seguro de que esto funciona en C? – pmb

+0

Digo que no funciona en c. el.pescado hizo una lambda muy simple pero para hacer una más complicada no es posible. – Eyal

+0

lo siento, no está claro si solo lees esta respuesta. Gracias. – pmb

Cuestiones relacionadas