public static object Bind(object d, Func <object, object> g) { if (Nil.Equals(d)) { return(Mzero); } else if (IsProcedure(d)) { return(new Func <object>(() => Bind(Call(d), g))); } else { return(Mplus(g.Call(Car(d)), Bind(Cdr(d), g))); } }
private static object Mplus(object d1, object d2) { if (Nil.Equals(d1)) { return(d2); } else if (IsProcedure(d1)) { return(new Func <object>(() => Mplus(d2, Call(d1)))); } else { return(Cons(Car(d1), Mplus(Cdr(d1), d2))); } }