Exemple #1
0
 public InsnMakeClosure(
     IList<ValueSymbol> paras,
     ISList<IInsn> insns,
     SourceInfo info
 )
 {
     mParams = paras;
     mInsns = insns;
     mInfo = info;
 }
Exemple #2
0
 public ValueCont(
     ISList<IInsn> insns,
     ISList<IValue> stack,
     IEnv env,
     ISList<KeyValuePair<IValue, IValue>> winders
 )
 {
     Insns = insns;
     Stack = stack;
     Env = env;
     Winders = winders;
 }
Exemple #3
0
 public ValueClosure(
     IList<ValueSymbol> paras,
     ISList<IInsn> insns,
     IEnv env,
     SourceInfo info
 )
 {
     mParams = paras;
     mInsns = insns;
     mEnv = env;
     mInfo = info;
 }
Exemple #4
0
 public void SetCont(IValue returnValue, ValueCont cont, SourceInfo info)
 {
     var winders = cont.Winders;
     if (winders == Winders)
     {
         Insns = cont.Insns;
         Stack = cont.Stack;
         Env = cont.Env;
         Push(returnValue);
     }
     else if (winders.ContainsList(Winders))
     {
         var newWinders = winders.GetPreviousList(Winders);
         IValue before = newWinders.Head.Key;
         Stack<IInsn> insnStack = new Stack<IInsn>();
         insnStack.Push(new InsnPush(before));
         insnStack.Push(new InsnCall(0, info));
         insnStack.Push(InsnPop.Instance);
         insnStack.Push(new InsnSetWinders(newWinders));
         insnStack.Push(new InsnPush(cont));
         insnStack.Push(new InsnPush(returnValue));
         insnStack.Push(new InsnCall(1, info));
         Insns = insnStack.ToSList();
         Stack = SList.Nil<IValue>();
     }
     else
     {
         IValue after = Winders.Head.Value;
         Winders = Winders.Tail;
         Stack<IInsn> insnStack = new Stack<IInsn>();
         insnStack.Push(new InsnPush(after));
         insnStack.Push(new InsnCall(0, info));
         insnStack.Push(InsnPop.Instance);
         insnStack.Push(new InsnPush(cont));
         insnStack.Push(new InsnPush(returnValue));
         insnStack.Push(new InsnCall(1, info));
         Insns = insnStack.ToSList();
         Stack = SList.Nil<IValue>();
     }
 }
Exemple #5
0
 public void Push(IInsn insn)
 {
     mInsns = SList.Cons<IInsn>(insn, mInsns);
 }
Exemple #6
0
 public IInsn Pop()
 {
     IInsn insn = Peek();
     mInsns = mInsns.Tail;
     return insn;
 }
Exemple #7
0
 public Compiler()
 {
     mInsns = SList.Nil<IInsn>();
 }
Exemple #8
0
 public InsnSetWinders(ISList<KeyValuePair<IValue, IValue>> winders)
 {
     mWinders = winders;
 }
Exemple #9
0
 static DataInfo()
 {
     id         = IdManager.IdDeliverer.CreateId <IData, T>();
     name       = typeof(T).Name;
     dataBlocks = new SteadyList <BlockNode <T> >();
 }
Exemple #10
0
 private IValue Run(ISList<IInsn> insns)
 {
     VM vm = new VM(
         insns,
         SList.Nil<IValue>(),
         mEnv,
         SList.Nil<KeyValuePair<IValue, IValue>>()
     );
     while (true)
     {
         try
         {
             return vm.Run();
         }
         catch (RheaException e)
         {
             Console.WriteLine("{0}: {1}", e.Info, e.Message);
             ValueCont cont = new ValueCont(
                 SList.Nil<IInsn>(),
                 SList.Nil<IValue>(),
                 vm.Env,
                 SList.Nil<KeyValuePair<IValue, IValue>>()
             );
             vm.SetCont(null, cont, e.Info);
         }
     }
 }