gosub StackCreate wut ; Should fail gosub StackPop ww ; Should also fail gosub StackPop wut ; Add stuff to the stack gosub StackPush wut hi gosub StackPush wut lol gosub StackPush wut lmao gosub StackPush wut huhu gosub StackTop wut display #result gosub StackSize wut display #result gosub StackPop wut gosub StackPop wut gosub StackPop wut gosub StackPop wut display #result gosub StackPop wut display #result halt ; A stack implements: ; StackCreate ; StackPush ; StackPop ; StackTop ; A stack grows in size and cannot shrink below size 0. ; StackCreate ; Creates a new stack object with the given string name. ; #result = success ? #true : #false sub StackCreate { namespace push namespace local StackPush if %0 <> 1 || %1 = N/A { set %ret #false } else { set !NameSize %1 , size set % . !NameSize 0 set %ret #true } namespace clear namespace pop return %ret } ; StackPush ; Pushes an element on to the stack with the given name. ; #result := |StackName| sub StackPush { namespace push namespace local StackPush if %0 <> 2 || %1 = N/A || %2 = N/A { set %ret #false } else { set !StackName %1 , size set !StackSize % . !StackName set !StackSize !StackSize + 1 set % . !StackName !StackSize set !StackName %1 , !StackSize set % . !StackName %2 set %ret !StackSize } namespace clear namespace pop return %ret } ; StackPop ; Pops an element off the stack. ; #result := |StackName| sub StackPop { namespace push namespace local StackPush if %0 <> 1 || %1 = N/A { set %ret #false } else { gosub StackSize %1 if #result = #false || #result < 1 { set %ret #false } else { set !StackName %1 , size set !StackSize % . !StackName set !StackUnset %1 , !StackSize set % . !StackUnset set !StackSize !StackSize - 1 set % . !StackName !StackSize set !StackName %1 , !StackSize set %ret !StackSize } } namespace clear namespace pop return %ret } ; StackTop ; Returns the value at the top of the stack. ; #result := StackName . |StackSize| sub StackTop { namespace push namespace local StackPush if %0 <> 1 || %1 = N/A || %2 = N/A { set %ret #false } else { set !StackName %1 , size set !StackName % . !StackName set !StackName %1 , !StackName set %ret % . !StackName } namespace clear namespace pop return %ret } ; StackSize ; Returns the size of the stack. ; #result := |StackName| sub StackSize { namespace push namespace local StackSize if %0 <> 1 || %1 = N/A { set %ret #false } else { set !StackName %1 , size set !StackName % . !StackName if !StackName = N/A { set %ret #false } else { set %ret !StackName } } namespace clear namespace pop return %ret }