-module(rpn_calc). -export([eval/1, eval/2]). -vsn('0.2'). -author('Julian Fondren '). -license('No-advertise-clause BSD'). eval(S) -> eval(S, []). eval(S, Stack) -> rpn(lists:map(fun parse/1, lex(S)), Stack). rpn([], Stack) -> Stack; rpn([{lit, X}|T], Stack) -> rpn(T, [X|Stack]); rpn([{op, Op}|T], [A,B|Stack]) -> rpn(T, [op(Op, A, B)|Stack]). op('-', A, B) -> B - A; op('/', A, B) -> B / A; op(Op, A, B) -> erlang:Op(A,B). lex(S) -> {ok, Es} = regexp:split(S, "\s"), Es. parse(S) when list(S) -> case (catch list_to_integer(S)) of {'EXIT',_} -> case (catch list_to_float(S)) of {'EXIT',_} -> {op, list_to_atom(S)}; F -> {lit, F} end; N -> {lit, N} end.