defmodule Calculater do
def calculate(charlist) do
parse(charlist)
|> calc
end
defp parse(charlist) do
tokenize(charlist, [[]])
|> _parse
end
defp tokenize([], result) do
Enum.reverse(result)
end
defp tokenize([32|tail], result) do
tokenize(tail, [[] | result])
end
defp tokenize([head|tail], [cur|rest]) do
tokenize(tail, [cur ++ [head] | rest])
end
defp _parse([opnd1, op, opnd2]) do
num1 = number(opnd1, 0)
num2 = number(opnd2, 0)
{op, num1, num2}
end
defp number([], value) do
value
end
defp number([digit|tail], value) do
number(tail, value * 10 + digit - ?0)
end
defp calc({'+', n1, n2}), do: n1 + n2
defp calc({'-', n1, n2}), do: n1 - n2
defp calc({'*', n1, n2}), do: n1 * n2
defp calc({'/', n1, n2}), do: n1 / n2
end
IO.puts Calculater.calculate('123 + 27')
IO.puts Calculater.calculate('123 - 23')
IO.puts Calculater.calculate('100 * 2')
IO.puts Calculater.calculate('100 / 5')
^o^ > elixir practice_11_4.exs
150
100
200
20.0