34 lines
1.0 KiB
Plaintext
34 lines
1.0 KiB
Plaintext
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
|