示例#1
0
        public ChimpyObject Run(Context context, ChimpyException e)
        {
            if(localName != null)
                context.SetLocal(localName, e.GetRuntimeObject());

            return handler.Eval(context);
        }
示例#2
0
        public override ChimpyObject Eval(Context context)
        {
            if(receiver == null && arguments == null && context.HasLocal(method))
            {
                return context.GetLocal(method);
            }

            ChimpyObject evaledReceiver;
            if(receiver == null)
            {
                evaledReceiver = context.CurrentSelf;
            }
            else
            {
                evaledReceiver = receiver.Eval(context);
            }

            List<ChimpyObject> evaledArguments = new List<ChimpyObject>();
            if(arguments != null)
            {
                foreach(Node arg in arguments)
                {
                    evaledArguments.Add(arg.Eval(context));
                }
            }

            return evaledReceiver.Call(method,evaledArguments.ToArray());
        }
示例#3
0
 public override ChimpyObject Eval(Context context)
 {
     ChimpyObject receiverEvaled = receiver.Eval(context);
     if(receiverEvaled.IsTrue())
         return argument.Eval(context);
     return receiverEvaled;
 }
示例#4
0
 public override ChimpyObject Eval(Context context)
 {
     while(condition.Eval(context).IsTrue())
     {
         body.Eval(context);
     }
     return ChimpyRuntime.Nil;
 }
示例#5
0
        public override ChimpyObject Eval(Context context)
        {
            ChimpyObject lastEval = ChimpyRuntime.Nil;
            foreach(Node n in nodes)
            {
                lastEval = n.Eval(context);
            }

            return lastEval;
        }
示例#6
0
        public override ChimpyObject Eval(Context context)
        {
            if (condition.Eval(context).IsTrue())
            {
                return ifBody.Eval(context);
            }
            else if (elseBody != null)
            {
                return elseBody.Eval(context);
            }

            return ChimpyRuntime.Nil;
        }
        public override ChimpyObject Eval(Context context)
        {
            string [] parametersName;
            if(parameters == null)
            {
                parametersName = new string[0];
            }
            else
            {
                parametersName = parameters.ToArray();
            }

            context.CurrentClass.AddMethod(name,new InterpretedMethod(name,parametersName,body));
            return ChimpyRuntime.Nil;
        }
示例#8
0
        public Context(ChimpyObject currentSelf, ChimpyClass currentClass, Context parent)
        {
            this.currentClass=currentClass;
            this.currentSelf=currentSelf;
            this.parent=parent;

            if(parent == null)
            {
                locals=new Dictionary<string, ChimpyObject>();
            }
            else
            {
                locals=parent.locals;
            }
        }
示例#9
0
        public override ChimpyObject Call(ChimpyObject receiver, ChimpyObject [] arguments)
        {
            if(delegatedMethodCall != null)
                return delegatedMethodCall(receiver,arguments);

            Context context = new Context(receiver);
            if(parameters.Length != arguments.Length)
                throw new ArgumentError(name,parameters.Length,arguments.Length);
            for (int i=0;i<parameters.Length;i++)
            {
                context.SetLocal(parameters[i],arguments[i]);
            }

            return body.Eval(context);
        }
示例#10
0
        public override ChimpyObject Eval(Context context)
        {
            ChimpyClass klass;
            if(superName == null)
            {
                klass = new ChimpyClass(name);
            }
            else
            {
                ChimpyClass superClass = (ChimpyClass) context.CurrentClass.GetConstant(superName);
                klass = new ChimpyClass(name,superClass);
            }

            body.Eval(new Context(klass,klass));
            context.CurrentClass.SetConstant(name,klass);

            return klass;
        }
示例#11
0
        public override ChimpyObject Eval(Context context)
        {
            Context tryContext = context.MakeChildContext();

            try
            {
                return body.Eval(tryContext);
            }
            catch(ChimpyException exception)
            {
                foreach (CatchBlock block in catchBlocks)
                {
                    ExceptionHandler handler = block.ToExceptionHandler();
                    if(handler.Handle(exception)) return handler.Run(tryContext,exception);
                }

                throw exception;
            }
        }
示例#12
0
 public override ChimpyObject Eval(Context context)
 {
     return context.CurrentSelf;
 }
 public override ChimpyObject Eval(Context context)
 {
     return context.CurrentSelf.GetInstanceVariables(name);
 }
示例#14
0
        public static Context Run()
        {
            ChimpyClass objectClass = new ChimpyClass("Object");
            ChimpyRuntime.ObjectClass = objectClass;

            ChimpyObject main = new ChimpyObject();
            ChimpyRuntime.MainObject = main;
            ChimpyClass classClass = new ChimpyClass("Class");
            objectClass.chimpyClass = classClass;
            classClass.chimpyClass = classClass;
            main.chimpyClass = objectClass;

            objectClass.SetConstant("Object",objectClass);
            objectClass.SetConstant("Class",classClass);

            ChimpyRuntime.Nil = objectClass.NewSubclass("NilClass").NewInstance(null);
            ChimpyRuntime.True = objectClass.NewSubclass("TrueClass").NewInstance(true);
            ChimpyRuntime.False = objectClass.NewSubclass("FalseClass").NewInstance(false);

            ChimpyClass stringClass = objectClass.NewSubclass("String");
            ChimpyClass numberClass = objectClass.NewSubclass("Number");
            ChimpyClass integerClass = objectClass.NewSubclass("Integer");
            ChimpyClass floatClass = objectClass.NewSubclass("Float");
            ChimpyClass exceptionClass = objectClass.NewSubclass("Exception");

            exceptionClass.NewSubclass("IOException");
            exceptionClass.NewSubclass("TypeError");
            exceptionClass.NewSubclass("MethodNotFound");
            exceptionClass.NewSubclass("ArgumentError");
            exceptionClass.NewSubclass("FileNotFound");

            objectClass.AddMethod("print",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                foreach(ChimpyObject arg in arguments)
                {
                    Console.WriteLine(arg.ToJavaObject());
                }

                return ChimpyRuntime.Nil;
            }));

            objectClass.AddMethod("class",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                return receiver.chimpyClass;
            }));

            objectClass.AddMethod("eval",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                Context context= new Context(receiver);
                StringReader code = new StringReader(arguments[0].AsString());
                return context.Eval(code);
            }));

            objectClass.AddMethod("require",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                Context context = new Context();
                string filename = arguments[0].AsString();

                try
                {
                    return context.Eval(File.OpenText(filename));
                }
                catch (FileNotFoundException e)
                {
                    throw new ChimpyException("FileNotFound","File not found "+filename);
                }
            }));

            classClass.AddMethod("new",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                ChimpyClass self = (ChimpyClass) receiver;
                ChimpyObject instance = self.NewInstance();
                if(self.HasMethod("initialize")) instance.Call("initialize",arguments);
                return instance;
            }));

            classClass.AddMethod("name",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                ChimpyClass self = (ChimpyClass) receiver;
                return new ValueObject(self.Name);
            }));

            classClass.AddMethod("superclass",new InterpretedMethod(delegate (ChimpyObject receiver, ChimpyObject[] arguments){
                ChimpyClass self = (ChimpyClass) receiver;
                return self.SuperClass;
            }));

            integerClass.AddMethod("+",new OperatorMethod<Int32>(delegate (Int32 receiver, Int32 argument){
                return new ValueObject((Int32)(receiver+argument));
            }));
            return new Context(main);
        }
示例#15
0
 public override ChimpyObject Eval(Context context)
 {
     ChimpyObject value = expression.Eval(context);
     context.CurrentClass.SetConstant(name, value);
     return value;
 }
示例#16
0
 public override ChimpyObject Eval(Context context)
 {
     ChimpyObject value = expression.Eval(context);
     context.SetLocal(name,value);
     return value;
 }
示例#17
0
 public abstract ChimpyObject Eval(Context context);
示例#18
0
 public override ChimpyObject Eval(Context context)
 {
     if(receiver.Eval(context).IsTrue())
         return ChimpyRuntime.False;
     return ChimpyRuntime.True;
 }
示例#19
0
 public override ChimpyObject Eval(Context context)
 {
     return value;
 }
 public override ChimpyObject Eval(Context context)
 {
     ChimpyObject value = expression.Eval(context);
     context.CurrentSelf.SetInstanceVariable(name,value);
     return value;
 }
示例#21
0
 public override ChimpyObject Eval(Context context)
 {
     return context.CurrentClass.GetConstant(name);
 }