User:Orange/Super Stack!/v2

# v2 import sys,random def run(text,debug=0): prog = [line.lower for line in text.replace('\t',' ').replace('\n',' ').strip.split(' ') if line!=''] #Hack and slash the text to put each keyword in an element on a list if debug:print 'running:\n',prog stack = [] #The stack jump_stack = [] #The jump stack for if-fi loops pc = 0 #program counter while pc<len(prog): inst = prog[pc] if debug:print pc,':',inst #Numbers try: stack.append(int(inst)) except: pass #Math if  inst=='add':stack.append(stack.pop+stack.pop) elif inst=='sub': a,b = stack.pop,stack.pop stack.append(b-a) elif inst=='mul':stack.append(stack.pop*stack.pop) elif inst=='div': a,b = stack.pop,stack.pop stack.append(int(b/a)) elif inst=='mod': a,b = stack.pop,stack.pop stack.append(b%a) elif inst=='random': stack.append(random.randrange(stack.pop)) #Logic elif inst=='and': stack.append(int( bool(stack.pop) and bool(stack.pop) ))        elif inst=='or': stack.append(int( bool(stack.pop) or bool(stack.pop) ))        elif inst=='not': stack.append(int(bool(not stack.pop))) elif inst=='xor': stack.append(int( not (bool(stack.pop) or bool(stack.pop)) ))        elif inst=='nand': stack.append(int( not (bool(stack.pop) and bool(stack.pop)) ))        #I/O elif inst=='output':sys.stdout.write(str(stack.pop)+' ') elif inst=='input':stack.append(int(raw_input('?'))) elif inst=='outputascii':sys.stdout.write(chr(stack.pop)) elif inst=='inputascii':stack.extend(map(ord,raw_input(''))[::-1]) #Ah, slice steps #Stack manipulation elif inst=='pop':stack.pop elif inst=='swap': a,b = stack.pop,stack.pop stack.extend([a,b]) elif inst=='cycle':stack.insert(0,stack.pop) elif inst=='rcycle': stack.append(stack[0]) del stack[0] elif inst=='dup': a = stack.pop stack.append(a) stack.append(a) elif inst=='rev':stack.reverse #Flow elif inst=='quit':return elif inst=='if': #While loop if stack[-1]!=0: #If top number true, keep going in the loop jump_stack.append(pc-1) else: #Else, skip ahead to matching fi keyword loop = 1 while loop: pc += 1 inst = prog[pc] if inst=='if': loop += 1 elif inst=='fi': loop -= 1 elif inst=='fi': pc = jump_stack.pop #Misc elif inst=='debug':print stack pc+=1 if stack and debug: print'program ended with not empty stack:\n',stack def usage: print 'superstack.py my_program.ss! [-d] print '   -d  debug' sys.exit(2) try: from string import join run(        open(sys.argv[1]).read,         '-d' in sys.argv #debug     ) except IOError: print'Can not read file',sys.argv[1] except IndexError: usage
 * 1) Super Stack!
 * 1) Super Stack!
 * 1) 8/18/09
 * 2) changes from v1:
 * 3)  o output command now adds space after number
 * 4)    instead of newline
 * 5)  o added random keyword
 * 6) Make a note of bugs you find on the wiki!
 * 1) Make a note of bugs you find on the wiki!
 * 1) Make a note of bugs you find on the wiki!