def do_loop(condition, loop_fn): # store initial condition to stack pushint(condition if isinstance(condition,regint) else regint(condition)) def wrapped_loop(): # save condition to stack new_cond = regint.pop() # run the loop condition = loop_fn(new_cond) pushint(condition) return condition do_while(wrapped_loop) regint.pop()
def while_loop(loop_body, condition, arg): if not callable(condition): raise CompilerError('Condition must be callable') # store arg in stack pre_condition = condition(arg) if not isinstance(pre_condition, (bool,int)) or pre_condition: pushint(arg if isinstance(arg,regint) else regint(arg)) def loop_fn(): result = loop_body(regint.pop()) pushint(result) return condition(result) if_statement(pre_condition, lambda: do_while(loop_fn)) regint.pop()
def do_loop(condition, loop_fn): # store initial condition to stack pushint(condition if isinstance(condition, regint) else regint(condition)) def wrapped_loop(): # save condition to stack new_cond = regint.pop() # run the loop condition = loop_fn(new_cond) pushint(condition) return condition do_while(wrapped_loop) regint.pop()
def while_loop(loop_body, condition, arg): if not callable(condition): raise CompilerError('Condition must be callable') # store arg in stack pre_condition = condition(arg) if not isinstance(pre_condition, (bool, int)) or pre_condition: pushint(arg if isinstance(arg, regint) else regint(arg)) def loop_fn(): result = loop_body(regint.pop()) pushint(result) return condition(result) if_statement(pre_condition, lambda: do_while(loop_fn)) regint.pop()
def wrapped_loop(): # save condition to stack new_cond = regint.pop() # run the loop condition = loop_fn(new_cond) pushint(condition) return condition
def loop_fn(): result = loop_body(regint.pop()) pushint(result) return condition(result)