Julia: Piping operator |> with more than one argument

Viewed 4016

I am attempting to pass multiple arguments to the built in piping operator in Julia |>.

I would like something that works like this:

join([randstring() for i in 1:100], " ")

However, using the piping operator, I get an error instead:

[randstring() for i in 1:100] |> join(" ")

I am pretty sure this is a feature of multiple dispatch with join having its own method with delim in the join(strings, delim, [last]) method being defined as delim="" when omitted.

Am I understanding this correctly? Is there a work around?

For what is is worth the majority of my uses of piping end up taking more than one argument. For example:

[randstring() for i in 1:100] |> join(" ") |> replace("|", " ")
2 Answers

Metaprogramming to the rescue!

We'll use a simple macro to allow piping to multi-input functions.

    using Pipe, Random
    @pipe [randstring() for i in 1:100] |> join(_, " ")

So after calling the Pipe package all we're doing is

  1. using the @pipe macro

  2. designating where where to pipe to with the underscore ("_") [if the function only takes one input we don't need to bother with the underscore: e.g.

     @pipe 2 |> +(3,_) |> *(_,4) |> println   
    

will print "20"]

See here or here for more formal documentation of the Pipe package (not that there's much to document :).

Related