import State import io import structures_lib type StateType = { addDigit(_:Number)->Void doOp(_:String)->Void enter->Void clear->Void pop->Void exchange->Void} var calcState:StateType is readable := State.new var istream is readable:= io.input print "Type in a valid entry and hit return to \"press button\"" print "Valid entries: 0 1 2 3 4 5 6 7 8 9 + - \ * clear pop exch enter quit" // return next string entered (equivalent to pressing button) method getEntry->String is confidential{ var str := "" var nxt := istream.next while{nxt != "\n"} do { str := str ++ nxt nxt := istream.next } return str } // processes entries as they're entered method calculate->Boolean is confidential{ var entry := getEntry var ret:Boolean := false if(entry.size == 1) then{ if((entry.ord <= 57) && (entry.ord >= 48)) then{ calcState.addDigit(entry.asNumber) } else{ if((entry == "/") || (entry == "*") || (entry == "+") || (entry == "-")) then{ calcState.doOp(entry) } else{print "Error: invalid character"} } } else{ if(entry == "enter") then {calcState.enter} else {if(entry == "pop") then {calcState.pop} else{if(entry == "clear") then {calcState.clear} else {if(entry == "exch") then {calcState.exchange} else {if(entry == "quit") then {return true} else{print "Not a valid command"}}}}} } return ret } var done:Boolean is readable := false // calculator runs until user enter "quit" // exits with error at eof while{!istream.eof && !done} do {done := calculate}