From e65699f8d37e4d4b069afad55f2d22bfa271d101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sat, 8 Nov 2025 23:31:59 +0100 Subject: feat(calc): use rational number for abitrary precision --- lib/elixir_math_parser.ex | 14 ++++++++++++-- lib/main.ex | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/elixir_math_parser.ex b/lib/elixir_math_parser.ex index bb24d88..f7f916f 100644 --- a/lib/elixir_math_parser.ex +++ b/lib/elixir_math_parser.ex @@ -3,8 +3,11 @@ defmodule ElixirMathParser do Documentation for `ElixirMathParser`. """ + defdelegate numerator <~> denominator, to: Ratio, as: :new + use Numbers, overload_operators: true + defp reduce_to_value({:int, _line, value}, _state) do - {:ok, value} + {:ok, value <~> 1} end defp reduce_to_value({:var, _line, var}, state) do @@ -51,7 +54,14 @@ defmodule ElixirMathParser do defp evaluate_tree([{:eval, expr} | tail], state) do with {:ok, expr} <- reduce_to_value(expr, state) do - IO.puts(expr) + num = Ratio.numerator(expr) + den = Ratio.denominator(expr) + + case den do + 1 -> IO.puts(num) + _ -> IO.puts("#{num}/#{den}") + end + evaluate_tree(tail, state) end end diff --git a/lib/main.ex b/lib/main.ex index ad657ca..5418da5 100644 --- a/lib/main.ex +++ b/lib/main.ex @@ -7,8 +7,9 @@ defmodule ElixirMathParser.Main do def process_parse({:ok, tree}) do IO.puts("\nParse tree") IO.inspect(tree, pretty: true) + case ElixirMathParser.process_tree(tree) do - {:ok, _} -> :ok + {:ok, _} -> :ok {:error, reason} -> reason end end @@ -23,6 +24,7 @@ defmodule ElixirMathParser.Main do IO.puts("Parsed #{filename}, stopped at line #{line}") res = process_parse(:elixir_math_parser.parse(tokens)) + if res != :ok do IO.puts(res) end -- cgit v1.2.3