I had some time to spend waiting for my flight home a few days ago, so I decided to write a calculator using reverse polish notation.
See http://en.wikipedia.org/wiki/Reverse_Polish_notation for some background info.
Here comes the python code, but I doubt anyone is interested in it:-)
import sys
class Calc :
stack = []
commands = {}
def __init__ ( self ):
self . commands [ 'p' ] = ( 0 , self . cmd_print )
self . commands [ 'q' ] = ( 0 , sys . exit )
self . commands [ '+' ] = ( 2 , int . __add__ )
self . commands [ '-' ] = ( 2 , int . __sub__ )
self . commands [ '*' ] = ( 2 , int . __mul__ )
self . commands [ '/' ] = ( 2 , int . __div__ )
self . commands [ ' % ' ] = ( 2 , int . __mod__ )
self . commands [ '^' ] = ( 2 , int . __pow__ )
def run ( self ):
while 1 :
self . parse ( raw_input ( '> ' ))
def parse ( self , str ):
if str in self . commands :
if self . commands [ str ][ 0 ] == 0 :
self . commands [ str ][ 1 ]()
elif self . commands [ str ][ 0 ] == 2 :
if len ( self . stack ) < 2 :
print "stack underflow"
else :
self . cmd_binary ( self . commands [ str ][ 1 ])
else :
try :
self . stack . append ( int ( str ))
except ValueError :
pass
def cmd_print ( self ):
for i in self . stack :
print i
def cmd_binary ( self , method ):
b = self . stack . pop ()
a = self . stack . pop ()
self . stack . append ( method ( a , b ))
if __name__ == '__main__' :
Calc () . run ()