Ratio
Ratio is a library to work with rational numbers (also known as ‘fractions’) in Elixir.
A bit of history
Ratio has been around for a very long time. It was the first library I wrote when I started learning Elixir, with the first public release happening in March of 2016. (For Elixir v1.2. Oh, how the time flies!)
Throughout the years, my onlook on programming has changed a little, Elixir has changed a little, and the library changed to match.
From the start, Ratio
allowed to use the <|>
operator as shorthand notation to allow for a natural syntax like 1 <|> 2
. Ratio also supported overloaded math operators, for the same reason.
This operator overloading was later moved to an ‘opt-in’ approach. Later, support was added to mix-and-match overloaded math operators for different kinds of number types, by extracting this functionality to the Numbers library.
Recently it came to my attention that <|>
has been deprecated starting in Elixir v1.14.
And so, the library again had to slightly change.
Today
And this brings me to today. A release candidate for v4.0.0 of the library has been published to Hex.PM just now.
The important (backwards-incompatible) changes to v3.0.2 are:
- Remove infix operator
<|>
as its usage is deprecated in Elixir v1.14. - Switch the
Inspect
implementation to use the formRatio.new(10, 20)
instead of10 <|> 20
. - Remove implementation of
String.Chars
, as the old implementation was not in a (non-programmer) human-readable format.
You can still use <|>
or <~>
(which is not deprecated in Elixir v1.14 and should stay around for a long time yet to come), by writing
defdelegate numerator <~> denominator, to: Ratio, as: :new
in your module.
For instance, here is an example of if you want to use the full opt-in syntactic sugary goodness:
defmodule IDoAlotOfMathHere do
defdelegate numerator <~> denominator, to: Ratio, as: :new
use Numbers, overload_operators: true
def calculate(input) do
num = input <~> 2
result = num * 2 + (3 <~> 4) * 5.0
result / 2
end
end
iex> IDoAlotOfMathHere.calculate(42)
Ratio.new(183, 8)
Please try out the new release candidate of the library (by adding {:ratio, "4.0.0-rc.0"}
to your deps), and let me know if you encounter any bugs or oddities!
~Marten / Qqwy