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); }
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); }
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)); }); }
public Env(NyaObject currentSelf, NyaClass currentClass) { locals = new Dictionary <string, dynamic>(); current_self = currentSelf; current_class = currentClass; }
protected void Init(NyaClass runtimeClass) { Init(runtimeClass, new Dictionary <dynamic, NyaProc>(), null); }
protected void Init(NyaClass runtimeClass, Dictionary <dynamic, NyaProc> attrs, dynamic rubyValue) { runtime_class = runtimeClass; obj_attrs = attrs; ruby_value = rubyValue; }
public NyaObject(NyaClass runtimeClass, Dictionary <dynamic, NyaProc> attrs) : this(runtimeClass, attrs, null) { }
public NyaObject(NyaClass runtimeClass) : this(runtimeClass, new Dictionary <dynamic, NyaProc>(), null) { }
public NyaObject(NyaClass runtimeClass, Dictionary <dynamic, NyaProc> attrs, dynamic rubyValue) { Init(runtimeClass, attrs, rubyValue); }