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, }); }
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> { })); }
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); }); }
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!"); } }
public void Visit(ASTNode_Lambda node) { ByteCodes.Add(ByteCodeEnum.PUSH_SCRIPT_PROCEDURE); ByteCodes.Add(GetLiteralIndex(CompileToByteCode(node))); }
public void Visit(ASTNode_Lambda node) { }
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; }); }
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!"); }
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, }; }
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> { }); }