c#中的Universal Func 类型

我正在用C#编写一个小的Lisp解释器,它基本上已经工作了。 目前我正在使用一个接口来表示函数:

public interface LispFunction { object Apply(ArrayList parameters); } 

接口由内部(标准)函数,lambdas,宏扩展,通过reflection调用.net对象中的方法等多个类实现。 请注意,速度在这里不是问题,只是让翻译工作的乐趣,并在工作中使用它。

现在我想让我的小Lisp接受在解释器中使用的任意C#lambdas,如下所示:

 Lisp foo = new Lisp(); foo.GlobalEnvironment.AddFunction("test", (bool a, int b) => a ? b : "whoops"); foo.Eval(foo.Read("(test #t 5)")); // Should evaluate to (object) 5 

我想到的第一件事就是使用Func ,但我必须使用大量的重载方法来实现FuncFuncFunc等等上。

C#中是否有可能接受随后通过reflection调用的任意lambdas?

C#中是否有可能接受随后通过reflection调用的任意lambdas?

那么你可以编写一个方法来获取一个任意的委托

 public void AddFunction(string name, Delegate function) 

但是,lambda表达式的转换必须是特定的委托,因此您需要:

 Func function = (a, b) => a ? b : "whoops" foo.GlobalEnvironment.AddFunction("test", function); 

或者在通话中投下:

 foo.GlobalEnvironment.AddFunction("test", (Func)((a, b) => a ? b : "whoops")); 

你可以将所有重载放在一个地方,保持AddFunction完全通用,但是有一个像这样的静态类(有点像Tuple ):

 public static class Func { public Func Create(Func function) { return function; } public Func Create(Func function) { return function; } public Func Create(Func function) { return function; } // etc } 

这个类基本上只是为了方便而存在。 然后你打电话:

 foo.GlobalEnvironment.AddFunction("test", Func.Create((bool a, string b) => a ? b : "whoops"));