# Copyright (C) 2009 Andreas Bolka # See http://factorcode.org/license.txt for BSD license. import operator def mk_push(token): return lambda stack: push_insn(stack, int(token)) def binary_op(stack, op): stack.append(op(stack.pop(), stack.pop())); return stack def add_insn(stack): return binary_op(stack, operator.add) def sub_insn(stack): return binary_op(stack, operator.sub) def mul_insn(stack): return binary_op(stack, operator.mul) def div_insn(stack): return binary_op(stack, operator.div) def push_insn(stack, value): stack.append(value); return stack def eval_insn(stack, fn): return fn(stack) def rpn_tokenize(string): return string.split() def rpn_parse(string): return map(lambda token: {'+': add_insn, '-': sub_insn, '*': mul_insn, '/': div_insn}.get(token, mk_push(token)), rpn_tokenize(string)) def print_stack(stack): for item in stack: print item def rpn_eval(tokens): print_stack(reduce(eval_insn, tokens, [])) def rpn(): try: while True: rpn_eval(rpn_parse(raw_input('RPN> '))) except EOFError: pass