私は C# で小さな Lisp インタープリターを書いていますが、基本的には既に動作しています。現在、関数を表すためにインターフェイスを使用しています。
public interface LispFunction
{
object Apply(ArrayList parameters);
}
インターフェイスは、内部 (標準) 関数、ラムダ、マクロ展開、リフレクションを介した .net オブジェクト内のメソッドの呼び出しなどの複数のクラスによって実装されます。ここでは速度は問題ではなく、通訳者を仕事に連れて行って使用する喜びだけであることに注意してください.
ここで、私の小さな Lisp が、次のように、インタプリタ内で使用される任意の C# ラムダを受け入れるようにしたいと思います。
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# で、後でリフレクションを介して呼び出される任意のラムダを受け入れる可能性はありますか?