aboutsummaryrefslogtreecommitdiffstats
path: root/calc.erl
blob: a24b91528deb1abe756b15fe7fd728c958292711 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
-module(calc).
-export([factor/1]).

factor(Input) ->
    {Tail, Number2} = parseNumber(Input, []),
    {_, Result} = factorExtended(Tail, Number2),
    Result.

factor(Input, Number1) when is_integer(Number1) or is_float(Number1) ->
    {Tail, Number2} = parseNumber(Input, []),
    Result = math:pow(Number1, Number2),
    factorExtended(Tail, Result);

factor([], Number) ->
    {[], Number}.

factorExtended([$^|Tail], Result) ->
    factor(Tail, Result);
factorExtended(Tail, Result) ->
    {Tail, Result}.


parseNumber([$ |Input], []) ->
    %% skip spaces at start
    parseNumber(Input, []);
parseNumber([$-|Input], []) ->
    parseNumber(Input, "-");
parseNumber([Current|Input], Number) when ($0 =< Current) and ($9 >= Current) ->
    parseNumber(Input, Number ++ [Current]);
parseNumber(Input, Number) ->
    {Input, list_to_integer(Number)}.

%% eval(Formular) ->
%%     term(Formular,[]).

%% term([" "|Input], Parsed) ->
%%     term(Input, Parsed);
%% term([Current|Formular], Parsed) ->
%%     {ParsedFirst, Number1} = parseNumber([Current|Formular], []).

%% parseOperator([$ |Input]) ->
%%     parseOperator(Input);
%% parseOperator([Operator|Input]) ->
%%     {ok, list_to_atom(Operator)};
%% parseOperator([]) ->
%%     {error, unexpected_end_of_input}.

%% sum(Number1, Number2, '+') ->
%%     {ok, Number1 + Number2};
%% sum(Number1, Number2, '-') ->
%%     {ok, Number1 - Number2};
%% sum(_, _, _) ->
%%     {error, invalid_operator}.