RosettaCodeData/Task/Parsing-RPN-calculator-algo.../Maxima/parsing-rpn-calculator-algo...

40 lines
1012 B
Plaintext

rmod(i, j) := mod(j, i)$
rpow(x, y) := y^x$
rpn(sexpr) := (
operands: [],
expr: charlist(sexpr),
for token in expr do (
if token = "+" then (
push(pop(operands) + pop(operands), operands)
)
elseif token = "-" then (
push(-1 * (pop(operands) - pop(operands)), operands)
)
elseif token = "*" then (
push(pop(operands) * pop(operands), operands)
)
elseif token = "/" then (
push(1 / (pop(operands) / pop(operands)), operands)
)
elseif token = "%" then (
push(rmod(pop(operands), pop(operands)), operands)
)
elseif token = "^" then (
push(rpow(pop(operands), pop(operands)), operands)
)
elseif token # " " then (
push(parse_string(token), operands)
),
if token # " " then (
print(token, " : ", operands)
)
),
pop(operands)
)$
rpn("3 4 2 * 1 5 - 2 3 ^ ^ / +"), numer;