Quite creative, I like it!
I think there’s a certain nuance that’s missing though, which is:
Namely, I’m trying to create a concept which is as general as possible, and as a result, trying to avoid the behavior of threading the argument into a default position. Additionally, as has been expressed previously, the use of _
is somewhat wasteful, when within the local context it is possible to define new keywords—this would keep _
free for use in partial application, as PR #24990 proposes.
Indeed, if this proposal were to be accepted and #24990 were accepted (which is my hope), then many of the expressions here could look closer to Chain.jl:
"chains".{
split(_, "")
_.^2
join(_, "•")
uppercase
}
The other points that this misses are: 1) creation of an unneeded lambda (increases compile time) and 2) operator precedence. It’s frequent for chains to be short sub-expressions inside larger ones (e.g., arr.{filter(f, _), first}.a+1
), and the lower precedence of |>
forces more of it to be placed within the chain, e.g. arr |> {filter(f, _), first, it.a+1}
, which is clumsier. The high precedence of .
is useful.
Oh dear, now I understand the dislike for curly braces! How prevalent are such keyboards?