A Coder’s Corner

Blog de tecnologia y programación

Lambda Functions

Posted by gfaraj on May 24, 2007

En lenguajes de programacion, lambda expressions basicamente son funciones que se definen en el lugar de su uso y se pueden usar como “objetos” en el sentido que se pueden asignar a una variable y llamarlas en otro punto del programa. Para una definicion mas completa de lambda functions visiten: http://en.wikipedia.org/wiki/Lambda_expressions.

Las lambda functions estan presentes en varios lenguajes, como Eiffel, C#, Java, y proximamente en C++. C++ tiene Boost.Lambda, que es una libreria que trata de proveer esta funcionalidad. Veamos ejemplos en algunos de estos lenguajes.

C#
En C# existen los delegates que encapsulan funciones para que puedan ser usadas como objetos. Como ejemplo, consideremos una funcion que es llamada cuando un boton es clickeado:

public MyForm()
{
    button = new Button();
    // ...
    button.Click += new EventHandler(button_Click);
}

private void button_Click(object sender, EventArgs e)
{
    button.Text = "Hola";
}

Usando lambda functions, esto se convierte a:

public MyForm()
{
    button = new Button();
    // ...
    button.Click += delegate
    {
        button.Text = "Hola";
    }
}

Como ven, para cosas sencillas es muy util ya que no tenemos que definir una funcion aparte.

Java
En Java, es un poco mas complicado ya que lo que se define es una clase, y no una funcion. Por ejemplo:

Button button = new Button();
button.addActionListener(new ActionListener()
{
    public void onActionPerformed(ActionEvent e)
    {
        button.setLabel("Hola");
    }
});


C++
(con Boost.Lambda)
En C++ no hay nada en el lenguaje que permita definir un lambda expression. En la actualidad, C++ te deja pasar el puntero a una funcion y llamarla asi de otro lugar. Mucho trabajo se ha invertido para poder encapsular funciones en objetos para que sean mas util (vean Boost.Function y Boost.Bind). Un ejemplo es imprimir cada elemento de un vector:

void print(int x)
{
    std::cout << x << std::endl;
}

int main()
{
    std::vector<int> v(10);
    for_each(v.begin(), v.end(), &print);
}

Ahora usando Boost.Lambda:

int main()
{
    std::vector<int> v(10);
    for_each(v.begin(), v.end(), std::cout << _1 << std::endl);
}

El _1 es un objeto que actua como “placeholder” para el primer parametro de la funcion. Es una libreria muy limitada por el lenguaje, por eso no es de tanta utilidad como si el lenguaje soportara esto nativamente.

C++0x
Para el proximo estandar de C++ se van a agregar funciones lambda reales. Veamos el ejemplo anterior con el nuevo sintaxis:

int main()
{
    std::vector<int> v(10);
    for_each(v.begin(), v.end(), <>(int x)
    {
        std::cout << x << std::endl;
    });
}

En resumen, las lambda functions nos ayudan a reducir el codigo necesario para hacer una funcion sencilla que pueda ser pasada a funciones y tratada como un objeto. Es una caracteristica popular entre varios lenguajes de programación.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: