From: "zverok (Victor Shepelev) via ruby-core" Date: 2024-10-02T06:34:12+00:00 Subject: [ruby-core:119396] [Ruby master Feature#20770] A *new* pipe operator proposal Issue #20770 has been updated by zverok (Victor Shepelev). A couple of my counterpoints to `|>` (and towards `.{}`, if we do need syntax sugar in this place at all): While `|>` sure exists in other languages, we need to look into how it plays with the rest of the code/semantics of _our_ language (because in languages where it exists, it is typically supported by many small and large semantical facts). Say, in Elixir, one might write this (not precise code, writing kind-of pseudocode from the top of my head): ```elixir row |> String.split('|') |> Enumerable.map(fn x -> parse(x) end) |> Enumerable.filter(&Number.odd?) |> MyModule.process_numbers |> String.join('-') ``` In Ruby, the equivalent would be _mostly_ with ���current object���s methods���, as @vo.x notes, with `.then` occasionally compensating when you need to use another module: ```ruby row .split('|') .map { parse(it) } .filter(&:odd?) .then { MyModule.process_numbers(it) } .join('-') ``` What would `|>` bring here? ```ruby row .split('|') .map { parse(it) } .filter(&:odd?) |> MyModule.process_numbers(it) .join('-') ``` In my view, only syntactical/semantic confusion (what���s the scope in `|>` line? is `join` attached to its result, or is it inside the ���invisible block���?.. Why do we have a fancy symbol for `.then`, but not for `map` or `filter`, which are arguably even more widespread?..) Every time the topic arises, I am confused about it the same way. It seems like just chasing ���what others have,��� without much strong argument other than ���but others do it this way.��� But I might really miss something here. ---------------------------------------- Feature #20770: A *new* pipe operator proposal https://bugs.ruby-lang.org/issues/20770#change-110012 * Author: AlexandreMagro (Alexandre Magro) * Status: Open ---------------------------------------- Hello, This is my first contribution here. I have seen previous discussions around introducing a pipe operator, but it seems the community didn't reach a consensus. I would like to revisit this idea with a simpler approach, more of a syntactic sugar that aligns with how other languages implement the pipe operator, but without making significant changes to Ruby's syntax. Currently, we often write code like this: ```ruby value = half(square(add(value, 3))) ``` We can achieve the same result using the `then` method: ```ruby value = value.then { add(_1, 3) }.then { square(_1) }.then { half(_1) } ``` While `then` helps with readability, we can simplify it further using the proposed pipe operator: ```ruby value = add(value, 3) |> square(_1) |> half(_1) ``` Moreover, with the upcoming `it` feature in Ruby 3.4 (#18980), the code could look even cleaner: ```ruby value = add(value, 3) |> square(it) |> half(it) ``` This proposal uses the anonymous block argument `(_1)`, and with `it`, it simplifies the code without introducing complex syntax changes. It would allow us to achieve the same results as in other languages that support pipe operators, but in a way that feels natural to Ruby, using existing constructs like `then` underneath. I believe this operator would enhance code readability and maintainability, especially in cases where multiple operations are chained together. Thank you for considering this proposal! -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/