is there any way how to return lambda from another lambda recursively?
All I want to do is finite state machine, implemented as lambda, which returns lambda implementing another state (or null).
nesting Func<> won't work as I want.
C#, .NET 3.5
Example:
machine, 3 states, pseudolanguage
private Lambda State1()
{
if (SomeConditionIsMet)
return State2;
else
return State1;
}
private Lambda State2()
{
while (SomeConditionIsMet)
return State2;
else
return State3;
}
private Lambda State3()
{
LogEnd();
return NULL;
}
public void FSM()
{
Lambda _currentState = State1;
while(_currentState != NULL)
{
_currentState = _currentState();
}
}
I know, that I can workaround this using enum+switch, for example, but I'm just curious if I can do this.
Your question is already answered, but those reading this may be interested to note that you can use this technique to embed the Lambda calculus in C#.
First starting with:
Using various function definitions found at http://en.wikipedia.org/wiki/Lambda_calculus I defined various primitives as follows:
For various tests and the whole code see: http://code.google.com/p/jigsaw-library/source/browse/trunk/Theory/EmbeddedLambdaCalculus.cs
I believe you can declare a delegate type:
public delegate Lambda Lambda()
which returns a delegate of its own type. It does compile, anyway.Sure, you can return a lambda from another lambda:
What aspect of the syntax are you having trouble with? I am interested to know how people get this sort of thing wrong because that helps us design the language and documentation better next time.
UPDATE:
Sure you can.
Here we are returning a lambda that returns a lambda. Why do you believe this is impossible?
UPDATE:
Aha, I understand. You believe that the word "lambda" means "delegate". It does not. A lambda is a kind of expression that is convertible to a delegate.
If you want a delegate that returns a delegate then just declare that. That's perfectly legal. For example, here's a delegate called a "combinator" -- a combinator is a delegate which takes itself and returns itself:
That's a delegate named D which takes a D and returns a D.
You can make a lambda expression that is compatible with this delegate type. For example:
is the Identity combinator. Or
is the Mockingbird combinator in Raymond Smullyan's whimsical characterization of combinators.
As you correctly note, there's no way to make a generic Func that is this kind of combinator. I wrote an article about this fact back in 2006:
http://blogs.msdn.com/ericlippert/archive/2006/06/23/standard-generic-delegate-types-part-two.aspx
You can have a method which builds and returns an expression tree:
Also building expression trees in .NET 4.0 has been greatly enhanced.