From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on starla X-Spam-Level: X-Spam-Status: No, score=0.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_BL_SPAMCOP_NET,SPF_HELO_PASS, SPF_PASS autolearn=no autolearn_force=no version=3.4.6 Received: from nue.mailmanlists.eu (nue.mailmanlists.eu [94.130.110.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 882E21F5CB for ; Mon, 30 Sep 2024 02:24:38 +0000 (UTC) Authentication-Results: dcvr.yhbt.net; dkim=pass (1024-bit key; unprotected) header.d=ml.ruby-lang.org header.i=@ml.ruby-lang.org header.a=rsa-sha256 header.s=mail header.b=tcKzO2r3; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ruby-lang.org header.i=@ruby-lang.org header.a=rsa-sha256 header.s=s1 header.b=uFDSdp71; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ml.ruby-lang.org; s=mail; t=1727663076; bh=LAiK49B6eyGazcyI3SPZDJX2Xm/gZ+2gXoeV8l23p/A=; h=Date:References:To:Reply-To:Subject:List-Id:List-Archive: List-Help:List-Owner:List-Post:List-Subscribe:List-Unsubscribe: From:Cc:From; b=tcKzO2r3t3EwINJ4LEkot43qA1wuh9or22XFgwYlJuudyU2ZRWtoKUjp8A66ZXx5P lUlDJvLhD64UqouJRhmkG1Wxe4yZYSyWuE/kCVPb6GAxQckHrh8kVMk5hSbfmCCaiS 0NRuiFmBmmCOpNQckaA7MqGYn5gQe8Ak874Zgs54= Received: from nue.mailmanlists.eu (localhost [IPv6:::1]) by nue.mailmanlists.eu (Postfix) with ESMTP id 2CD0B43F7B for ; Mon, 30 Sep 2024 02:24:36 +0000 (UTC) Authentication-Results: nue.mailmanlists.eu; dkim=pass (2048-bit key; unprotected) header.d=ruby-lang.org header.i=@ruby-lang.org header.a=rsa-sha256 header.s=s1 header.b=uFDSdp71; dkim-atps=neutral Received: from s.wrqvtbkv.outbound-mail.sendgrid.net (s.wrqvtbkv.outbound-mail.sendgrid.net [149.72.123.24]) by nue.mailmanlists.eu (Postfix) with ESMTPS id 73A9D43EA6 for ; Mon, 30 Sep 2024 02:24:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ruby-lang.org; h=from:references:subject:mime-version:content-type: content-transfer-encoding:list-id:to:cc:content-type:from:subject:to; s=s1; bh=yWbptqyMRUOzJaFogSVCF0n6fuQ0l8qDplBIxEW/kyg=; b=uFDSdp71wkzT6YUACBE+nvddNs3fAiu5LtZCgSi55rTxq7Vx+gXJ7TsrqIqVYCfMhv4K q86oTKldJTTp9NvhsUvtWy9sBKhi1phzT/m8kertXMVRfXvlKl4qOVX8FFhiEZebFpv44y wNGGSWfzfdStC41jQaKKs9LB68F+uCMk1dm2OMz5oZHoqIF/kMXLDzSIM/c2URyvvHeFNg 6WZ1LUoesX/czq/1xcgUTYuBsKKL3Al1avfRxpNp4L6z8mzDY6XYhrDc1mQUtHtqX58j5d Vqppwrv+/O8YaXE+eUE0P7SJt/IEFivySmbCjV3vCIKQtzYS6p/jk1+VxsmEQDgA== Received: by recvd-55fc7fd858-8svmw with SMTP id recvd-55fc7fd858-8svmw-1-66FA0BD6-8 2024-09-30 02:24:22.854792747 +0000 UTC m=+1499132.926495611 Received: from herokuapp.com (unknown) by geopod-ismtpd-39 (SG) with ESMTP id TnI8DLTMQP65amrOnzo_dw for ; Mon, 30 Sep 2024 02:24:22.792 +0000 (UTC) Date: Mon, 30 Sep 2024 02:24:22 +0000 (UTC) Message-ID: References: Mime-Version: 1.0 X-Redmine-Project: ruby-master X-Redmine-Issue-Tracker: Feature X-Redmine-Issue-Id: 20770 X-Redmine-Issue-Author: AlexandreMagro X-Redmine-Issue-Priority: Normal X-Redmine-Sender: AlexandreMagro X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-Redmine-MailingListIntegration-Message-Ids: 95976 X-SG-EID: =?us-ascii?Q?u001=2EpIF=2F17X3TAYiUJ7JM=2FkjfL3UcUjMXtwdvMQvfIr+dBsdQCbu7=2FyC8JO0y?= =?us-ascii?Q?XpK4kBnHSJ2ak3grQiHABQKRXGn67QaGY5Gvlwz?= =?us-ascii?Q?E1IK+8efZyxNE5Y0aZr7fX09DlSWHCpI3p2CZ2R?= =?us-ascii?Q?XzkbN180X74Vfbff4J2v2UhyRXTIogEIcPmjchJ?= =?us-ascii?Q?x88vL3CAw1+ESgBqNeYZpnScDIs2B7rORnTVQND?= =?us-ascii?Q?OBERoIqON7+0XYir7enD3u7CgRLptgoZhyWOFzu?= =?us-ascii?Q?NMlTuzG9G4THDU9BhOCcYUVE5g=3D=3D?= To: ruby-core@ml.ruby-lang.org X-Entity-ID: u001.I8uzylDtAfgbeCOeLBYDww== Message-ID-Hash: RFRVGGAPFKLYW6FNL5EDZDKLNSYE3IIF X-Message-ID-Hash: RFRVGGAPFKLYW6FNL5EDZDKLNSYE3IIF X-MailFrom: bounces+313651-b711-ruby-core=ml.ruby-lang.org@em5188.ruby-lang.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.9 Precedence: list Reply-To: Ruby developers Subject: [ruby-core:119340] [Ruby master Feature#20770] A *new* pipe operator proposal List-Id: Ruby developers Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "AlexandreMagro (Alexandre Magro) via ruby-core" Cc: "AlexandreMagro (Alexandre Magro)" Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Issue #20770 has been updated by AlexandreMagro (Alexandre Magro). nobu (Nobuyoshi Nakada) wrote in #note-1: > In the previous trial syntax, the receiver of RHS was the result of LHS. > > In your proposal, the receiver of RHS is the same as LHS, and the LHS result is passed as an implicit argument? Exactly, this is the expected behavior of the pipe operator in other functional languages, such as Elixir. In those languages, the left-hand side (LHS) value is passed directly as an argument to the function on the right-hand side (RHS), either as the first or last argument depending on the language. For example, in Elixir, you might write: ```elixir value = value |> add(3) |> square() |> half() ``` My proposal for Ruby offers a more flexible approach. The LHS value can be passed as an explicit argument (using `_1` or `it`), allowing for greater control over how the RHS function handles the received value. Additionally, this approach simplifies the implementation by treating RHS as executable block, just as we already do with `.then`. ---------------------------------------- Feature #20770: A *new* pipe operator proposal https://bugs.ruby-lang.org/issues/20770#change-109951 * 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/