Skip to content

Commit c533223

Browse files
committed
Perform all side-effect in order in in/2
1 parent e5d8b00 commit c533223

3 files changed

Lines changed: 20 additions & 9 deletions

File tree

lib/elixir/lib/enum.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,11 +2023,16 @@ defmodule Enum do
20232023
operators work by using this function.
20242024
"""
20252025
@spec member?(t, element) :: boolean
2026-
def member?(enumerable, element) when is_list(enumerable) do
2026+
def member?(enumerable, element) do
2027+
__in__(element, enumerable)
2028+
end
2029+
2030+
@doc false
2031+
def __in__(element, enumerable) when is_list(enumerable) do
20272032
:lists.member(element, enumerable)
20282033
end
20292034

2030-
def member?(enumerable, element) do
2035+
def __in__(element, enumerable) do
20312036
case Enumerable.member?(enumerable, element) do
20322037
{:ok, element} when is_boolean(element) ->
20332038
element

lib/elixir/lib/kernel.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4723,7 +4723,7 @@ defmodule Kernel do
47234723
in_var(in_body?, left, &in_range(&1, expand.(first), expand.(last), expand.(step)))
47244724

47254725
_ when in_body? ->
4726-
quote(do: Elixir.Enum.member?(unquote(right), unquote(left)))
4726+
quote(do: Elixir.Enum.__in__(unquote(left), unquote(right)))
47274727

47284728
_ ->
47294729
raise_on_invalid_args_in_2(right)

lib/elixir/test/elixir/kernel_test.exs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,6 @@ defmodule KernelTest do
321321
defp struct_or_map?(arg, name) when is_struct(arg, name) or is_map(arg), do: true
322322
defp struct_or_map?(_arg, _name), do: false
323323

324-
defp not_atom(), do: "not atom"
325-
326324
test "is_struct/2" do
327325
assert delegate_is_struct(%{}, Macro.Env) == false
328326
assert delegate_is_struct([], Macro.Env) == false
@@ -336,7 +334,7 @@ defmodule KernelTest do
336334
assert guarded_is_struct(%{}, Macro.Env) == false
337335

338336
assert_raise ArgumentError, "argument error", fn ->
339-
is_struct(%{}, not_atom())
337+
is_struct(%{}, Process.get(:unused, "not atom"))
340338
end
341339
end
342340

@@ -417,7 +415,7 @@ defmodule KernelTest do
417415
assert guarded_is_exception(%{}, RuntimeError) == false
418416

419417
assert_raise ArgumentError, "argument error", fn ->
420-
delegate_is_exception(%{}, not_atom())
418+
delegate_is_exception(%{}, Process.get(:unused, "not atom"))
421419
end
422420
end
423421

@@ -594,7 +592,7 @@ defmodule KernelTest do
594592
assert map_dot(%{field: true})
595593
end
596594

597-
test "performs all side-effects" do
595+
test "performs all side-effects in order" do
598596
assert 1 in [1, send(self(), 2)]
599597
assert_received 2
600598

@@ -603,9 +601,17 @@ defmodule KernelTest do
603601

604602
assert 2 in [1 | send(self(), [2])]
605603
assert_received [2]
604+
605+
send(self(), :first) in send(self(), [:first, :second, :third])
606+
assert Process.info(self(), :messages) == {:messages, [:first, [:first, :second, :third]]}
607+
assert_received :first
608+
assert_received [:first, :second, :third]
609+
610+
send(self(), 0) in send(self(), -2)..send(self(), 2)//send(self(), 1)
611+
assert Process.info(self(), :messages) == {:messages, [0, -2, 2, 1]}
606612
end
607613

608-
test "has proper evaluation order" do
614+
test "preserves variable semantics" do
609615
a = 1
610616
assert 1 in [a = 2, a]
611617
# silence unused var warning

0 commit comments

Comments
 (0)