40 lines
1012 B
Plaintext
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;
|