Elixir has `rem(dividend, divisor)` to calculate the remainder of an 
integer division. However, as you probably know, there are different ways 
to handle remainders with negative numbers:

`rem` will take the remainder, but use the sign of the dividend, which 
means that the following function definition:

def is_odd(n)
  rem(n, 2) == 1
end

will fail for -1, -3, etc, as `rem(-3, 2)`, for instance, has as answer *-1*
.

It is also possible to make a *modulo* function, which uses the sign of the 
divisor. This has the advantage over the remainder function that it maps 
the whole domain of integers unto a smaller, cyclic, range of numbers. This 
is highly useful in many algorithms dealing with numbers or indices.

Many programming languages both have a remainder and a modulo function. I 
have seen multiple people roll their own definitions of `mod` in their 
Elixir libraries, because they needed it. 

I propose the addition of the modulo function, `mod(a, n)` to Elixir.

A possible implementation is as follows:

defmacro mod(a, n) do
  quote do
    unquote(a) - (unquote(n) * div(unquote(a), unquote(n))
  end
end

This implementation is guard-safe, so it can be used anywhere where `div` 
and `rem` are also allowed.

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/3b010961-59a1-408c-9b17-4bd9179d4a95%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to