Skip to content

Instantly share code, notes, and snippets.

@gboncoffee
Created April 8, 2024 00:44
Show Gist options
  • Save gboncoffee/389706c0a2a8724450a11abb5ab50825 to your computer and use it in GitHub Desktop.
Save gboncoffee/389706c0a2a8724450a11abb5ab50825 to your computer and use it in GitHub Desktop.
Reverse polish calculator in Elixir
defmodule Calc do
defp exec_op(_, "clear"), do: []
defp exec_op([fa | [fb | r]], token) do
case token do
"+" -> [fa + fb | r]
"-" -> [fa - fb | r]
"*" -> [fa * fb | r]
"/" -> [fa / fb | r]
"swap" -> [fb | [fa | r]]
end
end
defp exec_token(stack, token) do
case Float.parse(token) do
{f, _} -> [f | stack]
:error -> exec_op(stack, token)
end
end
defp exec_tokens(stack, []), do: stack
defp exec_tokens(stack, tokens) do
exec_token(stack, hd(tokens))
|> fn s -> exec_tokens(s, tl(tokens)) end.()
end
def mainloop(stack) do
if stack != [] do
IO.puts("#{hd(stack)}")
end
IO.gets("calc> ")
|> String.split()
|> fn tokens -> exec_tokens(stack, tokens) end.()
|> mainloop()
end
end
Calc.mainloop([])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment