Skip to content

Commit 5a2e838

Browse files
author
José Valim
committed
Deprecate <-/2 in favor of send/2
1 parent ebc6d76 commit 5a2e838

File tree

23 files changed

+90
-79
lines changed

23 files changed

+90
-79
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
* [Kernel] `is_alive/0` is deprecated in favor of `Node.alive?`
2323
* [Kernel] `Kernel.inspect/2` with `Inspect.Opts[]` is deprecated in favor of `Inspect.Algebra.to_doc/2`
2424
* [Kernel] `Kernel.inspect/2` with `:raw` option is deprecated, use `:records` option instead
25+
* [Kernel] Deprecate `<-/2` in favor of `send/2`
2526

2627
* Backwards incompatible changes
2728
* [String] Change `String.next_grapheme/1` and `String.next_codepoint/1` to return `nil` on string end

lib/elixir/lib/kernel.ex

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,24 @@ defmodule Kernel do
866866
:erlang.round(number)
867867
end
868868

869+
@doc """
870+
Sends a message to the given `dest` and returns the message.
871+
872+
`dest` may be a remote or local pid, a (local) port, a locally
873+
registered name, or a tuple `{registed_name, node}` for a registered
874+
name at another node.
875+
876+
## Examples
877+
878+
iex> send self(), :hello
879+
:hello
880+
881+
"""
882+
@spec send(dest :: pid | port | atom | { atom, node }, msg) :: msg when msg: any
883+
def send(dest, msg) do
884+
:erlang.send(dest, msg)
885+
end
886+
869887
@doc """
870888
Returns the pid (process identifier) of the calling process.
871889
Allowed in guard clauses.
@@ -893,7 +911,7 @@ defmodule Kernel do
893911
## Examples
894912
895913
current = Kernel.self
896-
child = spawn(fn -> current <- { Kernel.self, 1 + 2 } end)
914+
child = spawn(fn -> send current, { Kernel.self, 1 + 2 } end)
897915
898916
receive do
899917
{ ^child, 3 } -> IO.puts "Received 3 back"
@@ -931,7 +949,7 @@ defmodule Kernel do
931949
## Examples
932950
933951
current = Kernel.self
934-
child = spawn_link(fn -> current <- { Kernel.self, 1 + 2 } end)
952+
child = spawn_link(fn -> send current, { Kernel.self, 1 + 2 } end)
935953
936954
receive do
937955
{ ^child, 3 } -> IO.puts "Received 3 back"
@@ -1118,19 +1136,10 @@ defmodule Kernel do
11181136
quote do: __op__(:/, unquote(left), unquote(right))
11191137
end
11201138

1121-
@doc """
1122-
Sends a message to the process identified on the left.
1123-
A process can be identified by its PID or, if it is registered,
1124-
by an atom.
1125-
1126-
## Examples
1127-
1128-
process = Kernel.self
1129-
process <- { :ok, "Sending myself a message" }
1130-
1131-
"""
1132-
defmacro pid <- msg do
1133-
quote do: :erlang.!(unquote(pid), unquote(msg))
1139+
@doc false
1140+
def pid <- msg do
1141+
IO.write "<-/2 is deprecated, please use send/2 instead\n#{Exception.format_stacktrace}"
1142+
:erlang.!(pid, msg)
11341143
end
11351144

11361145
@doc """
@@ -1773,7 +1782,7 @@ defmodule Kernel do
17731782
end
17741783

17751784
def inspect(arg, opts) when is_list(opts) do
1776-
case opts[:raw] do
1785+
case Keyword.get(opts, :raw) do
17771786
nil ->
17781787
:ok
17791788
raw ->

lib/elixir/lib/kernel/error_handler.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule Kernel.ErrorHandler do
1919
{ :error, _ } ->
2020
parent = :erlang.get(:elixir_compiler_pid)
2121
ref = :erlang.make_ref
22-
parent <- { :waiting, self(), ref, module }
22+
send parent, { :waiting, self(), ref, module }
2323
:erlang.garbage_collect(self)
2424
receive do
2525
{ ^ref, :ready } ->

lib/elixir/lib/kernel/parallel_compiler.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ defmodule Kernel.ParallelCompiler do
6565
# Release waiting processes
6666
defp spawn_compilers([h|t], original, output, callbacks, waiting, queued, schedulers, result) when is_pid(h) do
6767
{ ^h, ref, _ } = List.keyfind(waiting, h, 0)
68-
h <- { ref, :ready }
68+
send h, { ref, :ready }
6969
waiting = List.keydelete(waiting, h, 0)
7070
spawn_compilers(t, original, output, callbacks, waiting, queued, schedulers, result)
7171
end
@@ -107,7 +107,7 @@ defmodule Kernel.ParallelCompiler do
107107
defp spawn_compilers([], original, output, callbacks, waiting, queued, schedulers, result) when length(waiting) == length(queued) do
108108
Enum.each queued, fn { child, _, _ } ->
109109
{ ^child, ref, _ } = List.keyfind(waiting, child, 0)
110-
child <- { ref, :release }
110+
send child, { ref, :release }
111111
end
112112
wait_for_messages([], original, output, callbacks, waiting, queued, schedulers, result)
113113
end
@@ -126,7 +126,7 @@ defmodule Kernel.ParallelCompiler do
126126
end
127127

128128
# Release the module loader which is waiting for an ack
129-
child <- { ref, :ack }
129+
send child, { ref, :ack }
130130

131131
available = lc { pid, _, waiting_module } inlist waiting,
132132
waiting_module == module,
@@ -138,7 +138,7 @@ defmodule Kernel.ParallelCompiler do
138138
{ :waiting, child, ref, on } ->
139139
# Oops, we already got this module. Do not put it on waiting.
140140
if :lists.member(on, result) do
141-
child <- { :release, ref }
141+
send child, { :release, ref }
142142
else
143143
waiting = [{ child, ref, on }|waiting]
144144
end

lib/elixir/lib/process.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,8 @@ defmodule Process do
264264

265265
@doc """
266266
Associates the name with a pid or a port identifier. name, which must
267-
be an atom, can be used instead of the pid / port identifier in the
268-
send operator (name <- message).
267+
be an atom, can be used instead of the pid / port identifier with the
268+
`Kernel.send/2` function.
269269
270270
See http://www.erlang.org/doc/man/erlang.html#register-2 for more info.
271271
"""

lib/elixir/lib/stream.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ defmodule Stream do
340340
341341
## Examples
342342
343-
iex> stream = Stream.each([1, 2, 3], fn(x) -> self <- x end)
343+
iex> stream = Stream.each([1, 2, 3], fn(x) -> send self, x end)
344344
iex> Enum.to_list(stream)
345345
iex> receive do: (x when is_integer(x) -> x)
346346
1

lib/elixir/src/elixir_dispatch.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ in_erlang_functions() ->
375375
% { now, 0 },
376376
{ round, 1 },
377377
{ self, 0 },
378+
{ send, 2 },
378379
{ size, 1 },
379380
{ spawn, 1 },
380381
{ spawn, 3 },

lib/elixir/test/elixir/stream_test.exs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,18 +169,18 @@ defmodule StreamTest do
169169
par = self
170170
pid = spawn_link fn ->
171171
Enum.each Stream.drop(&inbox_stream/2, -3),
172-
fn x -> par <- { :stream, x } end
172+
fn x -> send par, { :stream, x } end
173173
end
174174

175-
pid <- { :stream, 1 }
176-
pid <- { :stream, 2 }
177-
pid <- { :stream, 3 }
175+
send pid, { :stream, 1 }
176+
send pid, { :stream, 2 }
177+
send pid, { :stream, 3 }
178178
refute_receive { :stream, 1 }
179179

180-
pid <- { :stream, 4 }
180+
send pid, { :stream, 4 }
181181
assert_receive { :stream, 1 }
182182

183-
pid <- { :stream, 5 }
183+
send pid, { :stream, 5 }
184184
assert_receive { :stream, 2 }
185185
refute_receive { :stream, 3 }
186186
end

lib/elixir/test/erlang/control_test.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ try_else_test() ->
6060
% Receive
6161

6262
receive_test() ->
63-
{10, _} = eval("self() <- :foo\nreceive do\n:foo -> 10\nend"),
64-
{20, _} = eval("self() <- :bar\nreceive do\n:foo -> 10\n_ -> 20\nend"),
63+
{10, _} = eval("send self(), :foo\nreceive do\n:foo -> 10\nend"),
64+
{20, _} = eval("send self(), :bar\nreceive do\n:foo -> 10\n_ -> 20\nend"),
6565
{30, _} = eval("receive do\nafter 1 -> 30\nend").
6666

6767
vars_receive_test() ->
68-
{10, _} = eval("self() <- :foo\nreceive do\n:foo ->\na = 10\n:bar -> nil\nend\na"),
69-
{nil, _} = eval("self() <- :bar\nreceive do\n:foo ->\nb = 10\n_ -> 20\nend\nb"),
68+
{10, _} = eval("send self(), :foo\nreceive do\n:foo ->\na = 10\n:bar -> nil\nend\na"),
69+
{nil, _} = eval("send self(), :bar\nreceive do\n:foo ->\nb = 10\n_ -> 20\nend\nb"),
7070
{30, _} = eval("receive do\n:foo -> nil\nafter\n1 -> c = 30\nend\nc"),
7171
{30, _} = eval("x = 1\nreceive do\n:foo -> nil\nafter\nx -> c = 30\nend\nc").
7272

lib/ex_unit/lib/ex_unit/assertions.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,12 @@ defmodule ExUnit.Assertions do
292292
293293
## Examples
294294
295-
self <- :hello
295+
send self, :hello
296296
assert_received :hello
297297
298298
You can also match against specific patterns:
299299
300-
self <- { :hello, "world" }
300+
send self, { :hello, "world" }
301301
assert_received { :hello, _ }
302302
303303
"""
@@ -478,7 +478,7 @@ defmodule ExUnit.Assertions do
478478
479479
## Examples
480480
481-
self <- :hello
481+
send self, :hello
482482
refute_received :bye
483483
484484
"""

0 commit comments

Comments
 (0)