Example #1
0
        public NyaClass(NyaClass @base)
        {
            base_class = @base;

            //To solve chicken-egg problem
            NyaClass runtime_class = null;

            if (RuntimeFactory.Runtime != null)
            {
                runtime_class = (NyaClass)RuntimeFactory.Runtime["Class"];
                if (base_class == null)
                {
                    base_class = (NyaClass)RuntimeFactory.Runtime["Class"];
                }
            }
            else
            {
                runtime_class = null;
            }

            //Csharp do not allow init parent after child
            base.Init(runtime_class);
        }
Example #2
0
        public dynamic eval(Env env)
        {
            //class reopen
            NyaClass nya_class = (NyaClass)env[name];

            if (nya_class != null)
            {
                if (@base != null && env[@base] != null)
                {
                    nya_class = new NyaClass(env[@base]);
                }
                else
                {
                    nya_class = new NyaClass();
                }
                env[name] = nya_class;
            }
            //Evaluate the body of class, everything defined inside the class will have the class env
            var class_env = new Env(nya_class, nya_class);

            body.eval(class_env);
            return(nya_class);
        }
Example #3
0
        static RuntimeFactory()
        {
            var nya_class = new NyaClass();

            nya_class.runtime_class = nya_class;
            nya_class.base_class    = nya_class;
            var object_class = new NyaClass()
            {
                runtime_class = nya_class,
                base_class    = nya_class
            };

            Runtime = new Env(object_class.New());

            Runtime["Class"]     = nya_class;
            Runtime["Object"]    = object_class;
            Runtime["Number"]    = new NyaClass();
            Runtime["String"]    = new NyaClass();
            Runtime["BoolClass"] = new NyaClass();

            Runtime["false"]  = ((NyaClass)Runtime["BoolClass"]).NewWithValue(false);
            Runtime["true"]   = ((NyaClass)Runtime["BoolClass"]).NewWithValue(true);
            Runtime["nil"]    = ((NyaClass)Runtime["BoolClass"]).NewWithValue(null);
            Runtime["null"]   = ((NyaClass)Runtime["BoolClass"]).NewWithValue(null);  //add for sharp
            Runtime["Kernel"] = ((NyaClass)Runtime["Object"]).New();

            ((NyaClass)Runtime["Class"]).runtime_methods["new"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) => receiver.New());

            ((NyaClass)Runtime["Object"]).runtime_methods["get_slot"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                return(receiver[arguments[0].ruby_value]);
            });
            ((NyaClass)Runtime["Object"]).runtime_methods["set_slot"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                receiver[arguments[0].ruby_value] = arguments[1];
                return(receiver[arguments[0].ruby_value]);
            });
            ((NyaClass)Runtime["Object"]).runtime_methods["clone"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                return((NyaObject)receiver.Clone());
            });

            ((NyaClass)Runtime["Number"]).runtime_methods["+"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value + arguments.First().ruby_value;
                return(((NyaClass)Runtime["Number"]).NewWithValue(result));
            });
            ((NyaClass)Runtime["Number"]).runtime_methods["-"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value - arguments.First().ruby_value;
                return(((NyaClass)Runtime["Number"]).NewWithValue(result));
            });
            ((NyaClass)Runtime["Number"]).runtime_methods["*"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value * arguments.First().ruby_value;
                return(((NyaClass)Runtime["Number"]).NewWithValue(result));
            });
            ((NyaClass)Runtime["Number"]).runtime_methods["/"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value / arguments.First().ruby_value;
                return(((NyaClass)Runtime["Number"]).NewWithValue(result));
            });
            ((NyaClass)Runtime["Number"]).runtime_methods["%"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value % arguments.First().ruby_value;
                return(((NyaClass)Runtime["Number"]).NewWithValue(result));
            });
            ((NyaClass)Runtime["Number"]).runtime_methods[">"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value > arguments.First().ruby_value;
                return(result ? Runtime["true"] : Runtime["false"]);
            });
            ((NyaClass)Runtime["Number"]).runtime_methods["<"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value < arguments.First().ruby_value;
                return(result ? Runtime["true"] : Runtime["false"]);
            });
            ((NyaClass)Runtime["Number"]).runtime_methods["=="] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value == arguments.First().ruby_value;
                return(result ? Runtime["true"] : Runtime["false"]);
            });

            ((NyaClass)Runtime["BoolClass"]).runtime_methods["&&"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value && arguments.First().ruby_value;
                return(result ? Runtime["true"] : Runtime["false"]);
            });
            ((NyaClass)Runtime["BoolClass"]).runtime_methods["||"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var result = receiver.ruby_value || arguments.First().ruby_value;
                return(result ? Runtime["true"] : Runtime["false"]);
            });

            ((NyaClass)Runtime["Object"]).runtime_methods["print"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                Console.WriteLine(arguments.First().ruby_value);
                return(Runtime["null"]);
            });
            ((NyaClass)Runtime["Object"]).runtime_methods["read"] =
                new Func <NyaClass, IList <NyaObject>, NyaObject>((receiver, arguments) =>
            {
                var input = Console.ReadLine();
                return(((NyaClass)Runtime["String"]).NewWithValue(input));
            });
        }
Example #4
0
 public Env(NyaObject currentSelf, NyaClass currentClass)
 {
     locals        = new Dictionary <string, dynamic>();
     current_self  = currentSelf;
     current_class = currentClass;
 }
Example #5
0
 protected void Init(NyaClass runtimeClass)
 {
     Init(runtimeClass, new Dictionary <dynamic, NyaProc>(), null);
 }
Example #6
0
 protected void Init(NyaClass runtimeClass, Dictionary <dynamic, NyaProc> attrs, dynamic rubyValue)
 {
     runtime_class = runtimeClass;
     obj_attrs     = attrs;
     ruby_value    = rubyValue;
 }
Example #7
0
 public NyaObject(NyaClass runtimeClass, Dictionary <dynamic, NyaProc> attrs)
     : this(runtimeClass, attrs, null)
 {
 }
Example #8
0
 public NyaObject(NyaClass runtimeClass)
     : this(runtimeClass, new Dictionary <dynamic, NyaProc>(), null)
 {
 }
Example #9
0
 public NyaObject(NyaClass runtimeClass, Dictionary <dynamic, NyaProc> attrs, dynamic rubyValue)
 {
     Init(runtimeClass, attrs, rubyValue);
 }