Пример #1
0
        static ScriptProcedureMeta CompileToByteCode(ASTNode_Lambda node)
        {
            var generator = new ASTNodeVisitor_ByteCodeGenerator(node);

            return(new ScriptProcedureMeta {
                byteCodes = generator.ByteCodes.ToArray(),
                freeAdresses = node.freeAddresses.ToArray(),
                literals = generator.Literals.ToArray(),
                localVarCount = node.localVarCount,
            });
        }
Пример #2
0
        public object Interpret(object exp)
        {
            IASTNode node = ASTCompiler.Compile(null, ListProcess.TransformLibraryForms(exp));

            GlobalEnv.Instance().ReserveVariables(SymbolTable.GetGlobalSymbolCount());

            var lambda = new ASTNode_Lambda {
                bodyNode = node, localVarCount = 0, freeAddresses = new List <FreeAddress>(),
            };

            return(mStack.CallScriptProcedure(new ScriptProcedure(null, CompileToByteCode(lambda)), new List <object> {
            }));
        }
Пример #3
0
 public void Visit(ASTNode_Lambda node)
 {
     Value = (Procedure)(actuals => {
         Env newEnv = new Env(mEnv, node.localVarCount);
         for (int i = 0; i < actuals.Count; ++i)
         {
             Env.SetVar(newEnv, new LocalAddress {
                 index = i
             }, actuals[i]);
         }
         return(new ASTNodeVisitor_Interpreter(newEnv, node.bodyNode).Value);
     });
 }
Пример #4
0
            public ASTNodeVisitor_ByteCodeGenerator(ASTNode_Lambda node)
            {
                ByteCodes      = new List <int>();
                Literals       = new List <object>();
                mFreeAddresses = node.freeAddresses;

                mTailFlag.Push(true);
                node.bodyNode.AcceptVisitor(this);
                mTailFlag.Pop();

                if (mTailFlag.Count > 0)
                {
                    throw new Exception("Logic error!");
                }
            }
Пример #5
0
 public void Visit(ASTNode_Lambda node)
 {
     ByteCodes.Add(ByteCodeEnum.PUSH_SCRIPT_PROCEDURE);
     ByteCodes.Add(GetLiteralIndex(CompileToByteCode(node)));
 }
Пример #6
0
 public void Visit(ASTNode_Lambda node)
 {
 }
Пример #7
0
 public void Visit(ASTNode_Lambda node)
 {
     Value = (Procedure)(actuals => {
         Env newEnv = new Env(mEnv, node.localVarCount);
         for (int i = 0; i < actuals.Count; ++i) {
             Env.SetVar(newEnv, new LocalAddress { index = i }, actuals[i]);
         }
         return new ASTNodeVisitor_Interpreter(newEnv, node.bodyNode).Value;
     });
 }
Пример #8
0
 public void Visit(ASTNode_Lambda node)
 {
 }
Пример #9
0
 public void Visit(ASTNode_Lambda node)
 {
     ByteCodes.Add(ByteCodeEnum.PUSH_SCRIPT_PROCEDURE);
     ByteCodes.Add(GetLiteralIndex(CompileToByteCode(node)));
 }
Пример #10
0
            public ASTNodeVisitor_ByteCodeGenerator(ASTNode_Lambda node)
            {
                ByteCodes = new List<int>();
                Literals = new List<object>();
                mFreeAddresses = node.freeAddresses;

                mTailFlag.Push(true);
                node.bodyNode.AcceptVisitor(this);
                mTailFlag.Pop();

                if (mTailFlag.Count > 0) throw new Exception("Logic error!");
            }
Пример #11
0
 static ScriptProcedureMeta CompileToByteCode(ASTNode_Lambda node)
 {
     var generator = new ASTNodeVisitor_ByteCodeGenerator(node);
     return new ScriptProcedureMeta {
         byteCodes=generator.ByteCodes.ToArray(),
         freeAdresses=node.freeAddresses.ToArray(),
         literals=generator.Literals.ToArray(),
         localVarCount=node.localVarCount,
     };
 }
Пример #12
0
        public object Interpret(object exp)
        {
            IASTNode node = ASTCompiler.Compile(null, ListProcess.TransformLibraryForms(exp));
            GlobalEnv.Instance().ReserveVariables(SymbolTable.GetGlobalSymbolCount());

            var lambda = new ASTNode_Lambda { bodyNode = node, localVarCount =0, freeAddresses = new List<FreeAddress>(),};
            return mStack.CallScriptProcedure(new ScriptProcedure(null, CompileToByteCode(lambda)), new List<object> { });
        }