summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Fish <james@fishcakez.com>2017-11-25 15:42:16 -0800
committerJames Fish <james@fishcakez.com>2017-11-25 16:05:06 -0800
commit79e3c2f658999f6f2b9ebdb12a16e5fa1d4bb0ef (patch)
tree8ddc2b2051373af2e688d7c9fdb73936ceb3154a
parent36fde8be21ce15b74304b29f8b8cf633f31ae0db (diff)
downloadelixir-jf-integer-safe-guards.tar.gz
Do not raise on non-integer values in is_odd/is_evenjf-integer-safe-guards
-rw-r--r--lib/elixir/lib/integer.ex8
-rw-r--r--lib/elixir/test/elixir/integer_test.exs4
2 files changed, 6 insertions, 6 deletions
diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex
index 2c7ae9736..67295f833 100644
--- a/lib/elixir/lib/integer.ex
+++ b/lib/elixir/lib/integer.ex
@@ -28,9 +28,7 @@ defmodule Integer do
false
"""
- defmacro is_odd(integer) do
- quote(do: (unquote(integer) &&& 1) == 1)
- end
+ defguard is_odd(integer) when is_integer(integer) and (integer &&& 1) == 1
@doc """
Determines if an `integer` is even.
@@ -55,9 +53,7 @@ defmodule Integer do
true
"""
- defmacro is_even(integer) do
- quote(do: (unquote(integer) &&& 1) == 0)
- end
+ defguard is_even(integer) when is_integer(integer) and (integer &&& 1) == 0
@doc """
Computes the modulo remainder of an integer division.
diff --git a/lib/elixir/test/elixir/integer_test.exs b/lib/elixir/test/elixir/integer_test.exs
index b3d993edc..9d6352778 100644
--- a/lib/elixir/test/elixir/integer_test.exs
+++ b/lib/elixir/test/elixir/integer_test.exs
@@ -8,9 +8,11 @@ defmodule IntegerTest do
require Integer
def test_is_odd_in_guards(number) when Integer.is_odd(number), do: number
+ def test_is_odd_in_guards(atom) when is_atom(atom) and not Integer.is_odd(atom), do: :atom
def test_is_odd_in_guards(_number), do: false
def test_is_even_in_guards(number) when Integer.is_even(number), do: number
+ def test_is_even_in_guards(atom) when is_atom(atom) and not Integer.is_even(atom), do: :atom
def test_is_even_in_guards(_number), do: false
test "is_odd/1" do
@@ -23,6 +25,7 @@ defmodule IntegerTest do
assert Integer.is_odd(-3) == true
assert test_is_odd_in_guards(10) == false
assert test_is_odd_in_guards(11) == 11
+ assert test_is_odd_in_guards(:not_integer) == :atom
end
test "is_even/1" do
@@ -35,6 +38,7 @@ defmodule IntegerTest do
assert Integer.is_even(-3) == false
assert test_is_even_in_guards(10) == 10
assert test_is_even_in_guards(11) == false
+ assert test_is_even_in_guards(:not_integer) == :atom
end
test "mod/2" do