Skip to content

Commit 5a2e838

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

23 files changed

+90
-79
lines changed

CHANGELOG.md

+1
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

+25-16
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

+1-1
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

+4-4
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

+2-2
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

+1-1
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

+1
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

+6-6
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

+4-4
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

+3-3
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
"""

lib/ex_unit/lib/ex_unit/capture_io.ex

+4-4
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ defmodule ExUnit.CaptureIO do
9393
fun.()
9494
after
9595
:erlang.group_leader(original_gl, self)
96-
capture_gl <- :stop
96+
send capture_gl, :stop
9797
end
9898

9999
receive do
@@ -117,7 +117,7 @@ defmodule ExUnit.CaptureIO do
117117
after
118118
Process.unregister(device)
119119
Process.register(original_io, device)
120-
capture_io <- :stop
120+
send capture_io, :stop
121121
end
122122

123123
receive do
@@ -178,7 +178,7 @@ defmodule ExUnit.CaptureIO do
178178
group_leader_loop(runner, 0, buf)
179179
after wait ->
180180
:erlang.process_flag(:priority, :normal)
181-
runner <- { self, buffer_to_result(buf) }
181+
send runner, { self, buffer_to_result(buf) }
182182
end
183183
end
184184

@@ -189,7 +189,7 @@ defmodule ExUnit.CaptureIO do
189189
end
190190

191191
defp io_reply(from, reply_as, reply) do
192-
from <- { :io_reply, reply_as, reply }
192+
send from, { :io_reply, reply_as, reply }
193193
end
194194

195195
defp io_request({ :put_chars, chars }, buf) do

lib/ex_unit/lib/ex_unit/runner.ex

+3-3
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ defmodule ExUnit.Runner do
101101
# entities involved.
102102
Enum.each failed, &run_test(config, &1, [])
103103
config.formatter.case_finished(config.formatter_id, test_case)
104-
pid <- { self, :case_finished, test_case }
104+
send pid, { self, :case_finished, test_case }
105105
end
106106

107107
defp prepare_tests(config, tests) do
@@ -132,7 +132,7 @@ defmodule ExUnit.Runner do
132132
end
133133

134134
test_case = exec_case_teardown(test_case, context)
135-
self_pid <- { self, :case_finished, test_case, tests }
135+
send self_pid, { self, :case_finished, test_case, tests }
136136
end
137137

138138
receive do
@@ -181,7 +181,7 @@ defmodule ExUnit.Runner do
181181
exec_test_teardown(test, context)
182182
end)
183183

184-
self_pid <- { self, :test_finished, test.time(us) }
184+
send self_pid, { self, :test_finished, test.time(us) }
185185
end)
186186

187187
receive do

lib/ex_unit/test/ex_unit/assertions_test.exs

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ defmodule ExUnit.AssertionsTest do
8888

8989
test "assert receive waits" do
9090
parent = self
91-
spawn fn -> parent <- :hello end
91+
spawn fn -> send parent, :hello end
9292
:hello = assert_receive :hello
9393
end
9494

9595
test "assert received does not wait" do
96-
self <- :hello
96+
send self, :hello
9797
:hello = assert_received :hello
9898
end
9999

@@ -115,7 +115,7 @@ defmodule ExUnit.AssertionsTest do
115115
end
116116

117117
test "refute received when equal" do
118-
self <- :hello
118+
send self, :hello
119119
try do
120120
"This should never be tested" = refute_received :hello
121121
rescue

lib/ex_unit/test/ex_unit/capture_io_test.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ defmodule ExUnit.CaptureIOTest.GetUntil do
2121
end
2222

2323
def get_line(device // Process.group_leader) do
24-
device <- { :io_request, self, device, { :get_until, :unicode, "", __MODULE__, :until_new_line, [?\n] } }
24+
send device, { :io_request, self, device, { :get_until, :unicode, "", __MODULE__, :until_new_line, [?\n] } }
2525
receive do
2626
{ :io_reply, _, data } -> data
2727
end
@@ -289,7 +289,7 @@ defmodule ExUnit.CaptureIOTest do
289289
end
290290

291291
defp send_and_receive_io(req) do
292-
:erlang.group_leader <- { :io_request, self, self, req }
292+
send :erlang.group_leader, { :io_request, self, self, req }
293293
s = self
294294
receive do
295295
{ :io_reply, ^s, res} -> res

lib/iex/lib/iex/cli.ex

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,13 @@ defmodule IEx.CLI do
107107
receive do
108108
{ :begin, ^ref, other } ->
109109
:elixir.start_cli
110-
other <- { :done, ref }
110+
send other, { :done, ref }
111111
end
112112
end
113113

114114
fn ->
115115
IEx.start(config, fn ->
116-
parent <- { :begin, ref, self }
116+
send parent, { :begin, ref, self }
117117
receive do: ({ :done, ^ref } -> :ok)
118118
end)
119119
end

lib/iex/lib/iex/evaluator.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ defmodule IEx.Evaluator do
3030
defp loop(server) do
3131
receive do
3232
{ :eval, ^server, code, config } ->
33-
server <- { :evaled, self, eval(code, config) }
33+
send server, { :evaled, self, eval(code, config) }
3434
loop(server)
3535
{ :done, ^server } ->
3636
IEx.History.reset

lib/iex/lib/iex/helpers.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ defmodule IEx.Helpers do
452452
"""
453453
def respawn do
454454
if whereis = IEx.Server.whereis do
455-
whereis <- { :respawn, self }
455+
send whereis, { :respawn, self }
456456
true
457457
else
458458
false

0 commit comments

Comments
 (0)