Elixir pipe into operator bug

Sure:

iex(1)> defmodule Blah do
...(1)>   def unquote(:~>)(a, b, c), do: a+b+c 
...(1)> end
{:module, Blah,
 <<70, 79, 82, 49, 0, 0, 4, 76, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 123,
   0, 0, 0, 14, 11, 69, 108, 105, 120, 105, 114, 46, 66, 108, 97, 104, 8, 95,
   95, 105, 110, 102, 111, 95, 95, 7, 99, ...>>, {:~>, 3}}
iex(2)> Blah.~>(1, 2, 3)
6
iex(3)> import Blah
Blah
iex(4)> defmodule Testing do
...(4)>   def test() do
...(4)>     import Blah
...(4)>     unquote(:~>)(1, 2, 3)
...(4)>  end
...(4)> end
{:module, Testing,
 <<70, 79, 82, 49, 0, 0, 4, 80, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 141,
   0, 0, 0, 15, 14, 69, 108, 105, 120, 105, 114, 46, 84, 101, 115, 116, 105,
   110, 103, 8, 95, 95, 105, 110, 102, 111, 95, ...>>, {:test, 0}}
iex(5)> Testing.test() 
6

Not in this case because |> is a macro that expands ignoring immediate parenthetical syntax (specifically 2 ~> 3 compiles identically to (2 ~> 3), of which the pipe operator just prepends to prior to the first in the argument list of the function, and the function is just ~>).

Then what you are doing with 1 |> 3 ~> 3 is doing (1 |> 2) ~> 3, which is most definitely not piping a 1 into the function call of ~>(2, 3) but is rather doing ~>(1|>2, 3), and you can’t pipe a 1 into a 2, so that would fail pretty hard. :slight_smile:

Do note, the function ~> is just a normal function, not a macro or anything of the sort, these kind of function names are used in erlang DSEL’s at times when they make sense in the field that they are being used in.