sihui_io

sihui_io

rest is [“a”] and last_gift is “b”.
rest |> Enum.join(", “) returns “a”, which is a string.
“a” |> “#{}, and #{last_gift}” returns “a, and b”.
But when I pipe them together, I get ArgumentError.
rest |> Enum.join(”, ") |> “#{}, and #{last_gift}”
** (ArgumentError) argument error

What do I miss? :thinking:

Showing Posts 1 to 10

kokolegorille

kokolegorille

You cannot pipe a variable into a string.

iex> last = "b"
iex> x = "a"
iex> "a" |> "#{}, and #{last}"
"a, and b"
iex> x |> "#{}, and #{last}"      
** (ArgumentError) argument error

But You can

iex> "#{x}, and #{last}"   
"a, and b"

My guess is a string is not a function, and does accept only “” to be piped, but You can interpolate without pipe with “#{x}, and #{last}”.

sihui_io

sihui_io OP

Ha! That’s spot on! Thanks!

sihui_io

sihui_io OP

It turns out a |> "#{}" doesn’t mean we are actually interpolating a into the position of #{}

iex(71)> "a" |> "This is: #{}, and #{last}"
"aThis is: , and b"
iex(72)> "a" |> "This is: , and #{last}"
"aThis is: , and b"
kokolegorille

kokolegorille

It does not mean it’s piping a string into a string either…

iex> "aa" |> "bb"
** (ArgumentError) cannot pipe "aa" into "bb", can only pipe into local calls foo(), remote calls Foo.bar() or anonymous functions calls foo.()
    (elixir) lib/macro.ex:156: Macro.pipe/3
    (stdlib) lists.erl:1263: :lists.foldl/3
    (elixir) expanding macro: Kernel.|>/2
    iex:35: (file)
iex> "aa" |> "bb#{}"
"aabb"
sihui_io

sihui_io OP

ah, yeah…
I wonder if it’s actually a bug now…
:point_down: doesn’t seem to be an intended behavior, then…

iex(72)> "a" |> "This is: , and #{last}"
"aThis is: , and b"
kokolegorille

kokolegorille

Underneath, it’s

iex> quote do: "aa" |> "bb#{}" 
{:|>, [context: Elixir, import: Kernel],
 [
   "aa",
   {:<<>>, [],
    [
      "bb",
      {:::, [],
       [
         {{:., [], [Kernel, :to_string]}, [], [{:__block__, [], []}]},
         {:binary, [], Elixir}
       ]}
    ]}
 ]}
voltone

voltone

Right, so "234#{five}" is actually <<"234", five::binary>>, which is invoking Kernel.SpecialForms.<<>>. Piping something into that prepends the value at the front of that binary, if it is a legal parameter to <<>>.

So in the end "1" |> "234#{five}" expands to <<"1", "234", five::binary>> which happens to be legal. I don’t think it’s intentional.

sihui_io

sihui_io OP

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.

sihui_io

sihui_io OP

That makes sense now, thanks!

adworse

adworse

You actually kind of may pipe a variable into the string interpolation if it’s wrapped into the anonymous function call, like "test" |> (&"shmest #{&1}").()

Looks ugly though.

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews