我正在用 C# 编写一个小型 Lisp 解释器,它基本上已经可以工作了。目前我正在使用一个接口来表示函数:
public interface LispFunction
{
object Apply(ArrayList parameters);
}
该接口由多个类实现,用于内部(标准)函数、lambda、宏扩展、通过反射调用 .net 对象中的方法等。请注意,速度在这里不是问题,只是让口译员在工作中使用它的乐趣。
现在我希望我的小 Lisp 接受在解释器中使用的任意 C# lambda,如下所示:
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<a>
重载Func<a, b>
方法Func<a, b, c>
。
C# 中是否有可能接受稍后通过反射调用的任意 lambda?