From 79e3c2f658999f6f2b9ebdb12a16e5fa1d4bb0ef Mon Sep 17 00:00:00 2001 From: James Fish Date: Sat, 25 Nov 2017 15:42:16 -0800 Subject: Do not raise on non-integer values in is_odd/is_even --- lib/elixir/lib/integer.ex | 8 ++------ lib/elixir/test/elixir/integer_test.exs | 4 ++++ 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 -- cgit v1.2.1