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
,但我必须使用大量的重载方法来实现Func
, Func
, Func
等等上。
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"));