procedure main() EvalRPN("3 4 2 * 1 5 - 2 3 ^ ^ / +") end link printf invocable all procedure EvalRPN(expr) #: evaluate (and trace stack) an RPN string stack := [] expr ? until pos(0) do { tab(many(' ')) # consume previous seperator token := tab(upto(' ')|0) # get token if token := numeric(token) then { # ... numeric push(stack,token) printf("pushed numeric %i : %s\n",token,list2string(stack)) } else { # ... operator every b|a := pop(stack) # pop & reverse operands case token of { "+"|"-"|"*"|"^" : push(stack,token(a,b)) "/" : push(stack,token(real(a),b)) default : runerr(205,token) } printf("applied operator %s : %s\n",token,list2string(stack)) } } end procedure list2string(L) #: format list as a string every (s := "[ ") ||:= !L || " " return s || "]" end