def infer(bytecode, name=None): inputs = [] surplus = [] type_vars = {} for i,tok in enumerate(bytecode): if tok == 'if': if_block = bytecode[i-2] else_block = bytecode[i-1] decl = infer(if_block.bytecode) surplus.pop() surplus.pop() surplus.pop() elif vm.words.has_key(tok): decl = vm.words[tok][1:] if len(decl) == 0: decl = infer(vm.words[tok][0].bytecode) elif block(tok): decl = ((), ('block',)) else: decl = [[], [typeof(tok),]] new_inputs, _, type_vars = match_types(list(decl[0]), surplus, tok) inputs.extend(new_inputs) surplus.extend(decl[1]) inputs = replace(type_vars, inputs) surplus = replace(type_vars, surplus) return (tuple(inputs), tuple(surplus))
def do(stack): block = stack.pop() block(stack)