public static State interpretCallStatement(Call c, Functions funcs, State state){
		// grab the function from the call
		Function f = funcs.get(c.identifier().toString());
		
		// add function's locals to the state
		for (Declaration decl : f.locals().values())
			state.put(decl.variable(), Value.mkValue(decl.type()));

		// add parameters as their name defined by the function
		Iterator<Expression> argIt = c.arguments();
		Iterator<Declaration> funcIt = f.params().values().iterator(); 
		while(argIt.hasNext()){
			Expression exp = argIt.next();
			Declaration dec = funcIt.next();
			Value v = interpret(exp, funcs, state);
			state.put(dec.variable(), v);
		}
		
		// interpret every statement in the function's body
		Iterator<Statement> members = f.body().getMembers();
		while(members.hasNext()){
			Statement s = members.next();
			
			// if we hit the return statement, we can return the value of it's expression
			if(s instanceof Return){
				// remove locals and parameters from the state
				for (Declaration decl : f.locals().values())
					state.remove(decl.variable());
				for (Declaration decl : f.params().values())
					state.remove(decl.variable());
				return state;
			}// else, we interpret the statement
			else{
				state = interpret(s, funcs, state);
			}
		}
		
		// remove locals and parameters from the state
		for (Declaration decl : f.locals().values())
			state.remove(decl.variable());
		for (Declaration decl : f.params().values())
			state.remove(decl.variable());
		

		
		return state;
	}