我正在写在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表达式通过反射以后要叫什么?
有没有在C#中可能接受任意lambda表达式通过反射以后要叫什么?
那么你可以编写采取任意委托的方法:
public void AddFunction(string name, Delegate function)
然而,从一个lambda表达式转换必须是为特定的委托,所以你需要:
Func<bool, string, string> function = (a, b) => a ? b : "whoops"
foo.GlobalEnvironment.AddFunction("test", function);
或呼叫中投:
foo.GlobalEnvironment.AddFunction("test",
(Func<bool, string, string>)((a, b) => a ? b : "whoops"));
你可以把所有的超载在一个地方,保持AddFunction
完全通用,但有这样一个静态类(有点像Tuple
):
public static class Func
{
public Func<TResult> Create(Func<TResult> function) { return function; }
public Func<T1, TResult> Create(Func<T1, TResult> function)
{
return function;
}
public Func<T1, T2, TResult> Create(Func<T1, T2, TResult> function)
{
return function;
}
// etc
}
这个类基本上只存在方便。 然后你会打电话来:
foo.GlobalEnvironment.AddFunction("test",
Func.Create((bool a, string b) => a ? b : "whoops"));