Partilhar via


Lambda Expressions: C# has a Lisp??

Until I started looking at C# 3.0, I had never heard of lambda expressions.  A quick glance at Wikipedia tells me that they seem to pre-date computers, and languages like Lisp and Ruby seem to be based on them. But what the heck are lambda expressions??  The short answer is: They are just shorthand anonymous methods.

It took me a little while to get my head wrapped around they syntax (especially the "classical" syntax on wikipedia), but now I get it!!  In the simplest possible example, here is a function which adds one to the parameter:

Func<int, int> increment = A => A + 1;
Console.WriteLine(increment(5)); // outputs 6

Basically, we are defining a function "increment" as its parameter A, plus one.  Ok, that's not so bad, and I know a lot of places I could use a quick little function definition to parse some input or test some conditions.  Given that, I thought I would try something a little harder ... factorial.

Now with factorial, I ran into some immediate problems.  I don't think that lambda expressions are designed to be recursive.  I couldn't find an equivalent to "this" for the expression, and if I reference the function itself, I get an error telling me that I am using an undefined variable.  After some tinkering, I found a way around this.  Lambda expressions can be passed as parameters to other lambda expressions.  So what if I just passed my factorial expression a reference to itself.

Func<long, object, long> f = (A, B) => A == 0 ? 1 : (A*((Func<long,object,long>)B)(A-1,B));
Func<long, long> factorial = A => f(A, f);

Console.WriteLine(factorial(25).ToString("#,###"));
// outputs 7,034,535,277,573,963,776

And so that's what I did.  I had to pass the function reference as an object because I could not really specify its type.  f's definition would look like this if I tried:

Func<long, Func<long, Func<long, ... and so on ... , long>, long>, long>

The "f" expression does the real factorial work, "factorial" just gets the first iteration going.  Are lambda expressions going to change the way we program??  I don't know.  What do you think?

Lisp and similar languages (which are) seem to be making a comeback, and I had no clue that Orbitz.com is written in Lisp until I read it on wikipedia.  I don't really know anything about Lisp, but it got me thinking that maybe Lisp could be a first class .NET language now that lambda expressions will be baked into the CLR 3.0.  I'll have to look into this further.

Comments

  • Anonymous
    February 17, 2006
    Lambda expressions are a C# 3.0 language feature, not a CLR feature. Look at the IL that gets generated.

    There will be no CLR upgrade needed when C# 3.0 / LINQ comes out!
  • Anonymous
    March 31, 2006
    The comment has been removed
  • Anonymous
    May 23, 2006
    Bravo!  You have rediscovered a Y combinator!

    http://weblogs.asp.net/brianbec/archive/2004/08/25/220558.aspx

  • Anonymous
    May 23, 2006
    public delegate long dg(long l, dg gee);

    dg g = (long A, dg B) => A == 0 ? 1 : (A * B(A - 1, B));