Didn’t know about quote until now. Seems super useful, thanks!
That explains the ArgumentError:
iex(84)> x = "a"
"a"
iex(85)> quote do: "bb#{x}"
{:<<>>, [],
 [
   "bb",
   {:::, [],
    [
      {{:., [], [Kernel, :to_string]}, [], [{:x, [], Elixir}]},
      {:binary, [], Elixir}
    ]}
 ]}
iex(86)> quote do: x|> "bb#{}"
{:|>, [context: Elixir, import: Kernel],
 [
   {:x, [], Elixir},
   {:<<>>, [],
    [
      "bb",
      {:::, [],
       [
         {{:., [], [Kernel, :to_string]}, [], [{:__block__, [], []}]},
         {:binary, [], Elixir}
       ]}
    ]}
 ]}
Basically #{} expects an argument to be passed in, but we are not passing anything to #{} when we do x |> "bb#{}". But "bb#{x}" does.