Beispiel #1
0
        public static Object Call(Cons args, Environment environment)
        {
            string v = //"//(call " + Printer.ConsToString(args) + ")" + NewLine +
                       "{" + NewLine;

            ArrayList argtypes = new ArrayList();
            ArrayList argz     = new ArrayList();

            if (args.Length() > 2)
            {
                foreach (object arg in (args.Cddr() as Cons))
                {
                    if (Primitives.IsAtom(arg))
                    {
                        argz.Add(Printer.WriteToString(arg));
                    }
                    else
                    {
                        string argn = MakeUnique("arg");
                        string sv   = Generate(arg, environment);
                        sv += string.Format(@"{0} {1} = ({0}) retval;
", typeof(object), argn);

                        argz.Add(argn);

                        v += sv;
                    }
                    argtypes.Add(typeof(object));
                }
            }

            string typemethname = args.Car().ToString();

            string methname = typemethname;
            string typename = string.Empty;
            Type   type     = typeof(object);

            int i = methname.LastIndexOf(".");

            if (i >= 0)
            {
                methname = methname.Substring(i + 1);
                typename = typemethname.Substring(0, i);
                type     = TypeCache.FindType(typename);
            }

            MethodInfo mi = null;

            mi = type.GetMethod(methname, BindingFlags.IgnoreCase
                                | BindingFlags.Public | BindingFlags.Instance, binder, argtypes.ToArray(typeof(Type)) as Type[], null);

            string objn = string.Empty;

            if (mi == null)
            {
                type = TypeCache.FindType(args.Second().ToString());
                mi   = type.GetMethod(methname, BindingFlags.IgnoreCase
                                      | BindingFlags.Public | BindingFlags.Static, binder, argtypes.ToArray(typeof(Type)) as Type[], null);

                if (mi == null)
                {
                    // use reflection
                    v += Generate(args.Second(), environment);
                    v += string.Format(@"retval = retval.GetType().InvokeMember(""{0}"", 
BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, retval,
new object[]{{", methname) +
                         string.Join(", ", argz.ToArray(typeof(string)) as string[]) + @"});
}
";
                    return(v);
                }
                else
                {
                    objn = type.ToString();
                }
            }
            else
            {
                objn = MakeUnique("obj");
                v   += Generate(args.Second(), environment);
                v   += string.Format(@"{0} {1} = ({0}) retval;
", type, objn);
            }

            v += "retval = " + (mi.ReturnType == typeof(void) ? @"null;
" : "") + objn + "." + mi.Name + "(" +
                 string.Join(", ", argz.ToArray(typeof(string)) as string[]);

            return(v + @");
}
");
        }
Beispiel #2
0
        public static string GenerateCons(Cons args, Environment environment)
        {
            // ananlysi cons
            if (args == null)
            {
                return(@"//retval = null; // dont null mite need retval
");
            }
            else
            {
                Symbol sym = args.Car() as Symbol;

                object e = Runtime.Eval(sym, environment);

                if (e is Function)
                {
                    Function f = e as Function;

                    string v    = "{" + NewLine;
                    Cons   rest = args.Rest() as Cons;
                    v += GenerateFuncCall(f.Method.DeclaringType.ToString(), f.Method.Name, rest, environment);
                    return(v + "}" + NewLine);
                }

                else if (e is SpecialForm)
                {
                    SpecialForm f = e as SpecialForm;

                    Cons rest = args.Rest() as Cons;

                    string r = Printer.ConsToString(rest);

                    return(Runtime.EvalString("(gen-" + f.Method.Name + " " + r + ")", environment) as string);
                }

                else if (e is Macro)
                {
                    Macro m    = e as Macro;
                    Cons  rest = args.Rest() as Cons;
                    Cons  em   = m.Expand(rest) as Cons;

                    return(Generate(em, environment));
                }
                else if (e is Closure)
                {
                    extracode += Closure(new Cons(sym), environment) as string;

                    string v    = "{" + NewLine;
                    Cons   rest = args.Rest() as Cons;
                    v += GenerateFuncCall(null, environment.GetValue(sym) as string, rest, environment);
                    return(v + "}" + NewLine);
                }
                else if (currsymbols.ContainsKey(sym))
                {
                    string v    = "{" + NewLine;
                    Cons   rest = args.Rest() as Cons;
                    v += GenerateFuncCall(null, environment.GetValue(sym) as string, rest, environment);
                    return(v + "}" + NewLine);
                }
                else
                {
                    // not good, lets not support this for now
//          try
//          {
//            return "// call not supported";// Call(args, environment).ToString();
//          }
//          catch
//          {
                    string margs = GetArgs();
                    string v     = GenerateList(args.Rest() as Cons, environment, margs);
                    return(string.Format("retval = LSharp.Cons.FromList({0});{1}",
                                         margs, NewLine));
//          }
                }
            }
        }