From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 22702 invoked from network); 4 Jul 2023 01:56:50 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 4 Jul 2023 01:56:50 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1688435810; b=cONzjne3VHBVsl6dOdBaascAShlauRGAoBNQMa5sC39gFQ6XVaMukgOJIU2Wep5HESCWYoNj9S AMPtwkXH6+izNsNOUp4VgHs3zSTZQofPIWfKYYrxqlwNOFFE6QbfsoMeEvfN8ASjlYgHe7zcBC Q+dNBJ528y2x13V7bll5Az8h0O8U5OhA1D+YcB96ZFr39QcGCqdXGbkr+znvGFwt3Rk+m76keI bqvrAc5LNIpY4RxLAKGp8FLxC0q71Psiqz9cPnsaxaswY6aGrrKA6LUDqqK5jFa/KmnJ9H/N1x YWNbGS7I2jl1NVEdYN1piap7Hj5rIA26jNnTf9ZEVDpadA==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-ej1-f49.google.com) smtp.remote-ip=209.85.218.49; dkim=pass header.d=brasslantern-com.20221208.gappssmtp.com header.s=20221208 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1688435810; bh=f5ZzL1/ZpGDG/yIoAgTIWwWB+IyOM0YOMVWXW6h6oSs=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:DKIM-Signature:DKIM-Signature; b=Ex+AbZJN7n9D5PUKKxGa40dQrJ1XTD3veHu0VbuJuyUYs6WqTn4w7EnWoJJWqDCt/1aekRTN0+ AsuPIOiGT6JaPk9eFT5vJlCkikqbv6D8fYWuGWEjEmLLBu3hd5ABMER/p1UBksIjsnbjD77V9R JfG/C8AXMoVPUPg4lO2H/gdqj6pgfaPw+15EIsZBZY+IW2Y22MCPI3MDk5umuRvZUU+leK37fn aXe7SIwsiiUaD+5i4IuzB7jXov2W1XLynbGRllMEkCBVJdR+DbtK1zmk1Jrz/kUsWhdAcwzSPw 4L8WhZgnXfTkjb+cWcoszh96284dSIdHytXJPzpxP+FUig==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:To:Subject:Message-ID: Date:From:In-Reply-To:References:MIME-Version:Reply-To:Cc: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=AUmF6M5klVeLp2mrmsCXj42Et0Z33a2Ud7gNOLbqMkw=; b=QDqw/xIJQCk5R/8w5pcJ8SYYyb WMIjbxt0li2B0A+54fcAQAS7HsPVN7EmQhgOeJDOOxlWvscI/1MVlWElOIZzcuJQCvI/3s7S+dz/J Ho7R1wZn9J8ID02lz8CsoQYoNJKi1kpc8P4wjAzTUFgyPOs/T77cyknYKWiClJY53wNAAoOnnzfPH 5q1XcjhzArSFD74a4+pprlOwTyLWLLdc59XnlfZpgdPVtcg0BNZBfxH8tw4J5EoBgSe92/Sk9oHfV ghOhKJRRqibFMYEEVjpW6FeBl40HWmD37zc8xaXI2mVjFlercEaXDNCjmEZRNW9cEO2QCL5Jbb7Rr EJNUagIg==; Received: by zero.zsh.org with local id 1qGVHd-0009P7-Gy; Tue, 04 Jul 2023 01:56:49 +0000 Authentication-Results: zsh.org; iprev=pass (mail-ej1-f49.google.com) smtp.remote-ip=209.85.218.49; dkim=pass header.d=brasslantern-com.20221208.gappssmtp.com header.s=20221208 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none Received: from mail-ej1-f49.google.com ([209.85.218.49]:49544) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1qGVGv-00094K-HP; Tue, 04 Jul 2023 01:56:11 +0000 Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-992b66e5affso576254266b.3 for ; Mon, 03 Jul 2023 18:56:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20221208.gappssmtp.com; s=20221208; t=1688435764; x=1691027764; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=AUmF6M5klVeLp2mrmsCXj42Et0Z33a2Ud7gNOLbqMkw=; b=umdeoZYM7Q/c6h0n7CoNZsjpyFXkMYFRYUwhImWzoIXR5XYkH4cL5jhL9IRpdMUxzH HE/on3r0hE8xWKTVonl0F+Gnet1hH4L0OdagWtiCr0CUsdqRypdcFOFUdMY+0Dzaze9n +gZ1if9Jyxq3xzNp7wxPGTLEwpfnMFQWxZ0spnuKpfZGPocFSotz+Pm9fZYu4H8fjjDr SX9levqeRaGuQ737l6aUvEZfZfIF9ls54NszDMQcQBLLxgOa0rAh5Mb4TBAlDT/Rz2Sk /fKzgUWA05pPq41WOo8TTumxi9D4OeIgDgDJA/v0bH+ZrwnMYE9I9XzZBuk2R69wqsdV 6v2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688435764; x=1691027764; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=AUmF6M5klVeLp2mrmsCXj42Et0Z33a2Ud7gNOLbqMkw=; b=jnLHFmGuc6OGW4IkMms2IQJMydq/HYTFkIE9d0/k+ZB3VDpj8i+g7yO5TtOFGRIUtO pj4JGZocI7a+3vlV2KbHVKsNQtzOBk2npHfR0LEmiTRVnGGdou3vnc+zpxS9WUn7r4SL mEtKj+OrfB5BkRANLG+F554cKh0hzS5b3qTTO3z4mM/gMTrucjxXfiVgsFyQWswVxfNf mlYyMS0fydagUkh0tilb8R9erLQnJShEYquAFP6KGIXgs9z+5SkIO3K+7lhQMhllaJIQ niKaJnSeWYfwzPBnpDmFfebeowsZl9iaAjJE1Uox/w6g74uEamfDTzQQvLO+hBwgaBjd 7jvQ== X-Gm-Message-State: ABy/qLb6WKeA7PjiDoYXPVg9djlyoQdozBj4tMi39krYCa9S+7KdPZga zH3cDKcuD1+cWSOoLCh19IkaurBnhTUyWyp1ff2dgotzGLCW0o+Mah8= X-Google-Smtp-Source: APBJJlF1q0Hd5aolYZu7+vde9pTTQ3GAPF6y1FmiX9uXL4KP+fC9XNovgSvytBsMbs/bbeab87QoDh7g+BrxUTL+xqI= X-Received: by 2002:a17:906:af93:b0:98e:37fe:691b with SMTP id mj19-20020a170906af9300b0098e37fe691bmr9073668ejb.34.1688435764298; Mon, 03 Jul 2023 18:56:04 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Bart Schaefer Date: Mon, 3 Jul 2023 18:55:53 -0700 Message-ID: Subject: Re: [PATCH] Support the mksh's ${|func;} substitution To: Zsh hackers list Content-Type: multipart/mixed; boundary="000000000000f5471b05ff9f9542" X-Seq: 51898 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: --000000000000f5471b05ff9f9542 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, May 3, 2023 at 7:46=E2=80=AFAM Sebastian Gniazdowski wrote: > > I was looking at some of my old patches and stumbled upon this one > which implements mksh' ${|func;} substitution. > [...] Original thread: > https://zsh.org/mla/workers/2019/msg00768.html I'm not going to try to recapitulate all the objections/discussions from that thread, but here are some thoughts. > [...] The old thread went > over a complex (x) flag [but] ${!func;} doesn't block us from adding a > more advanced x-flag in the future. [...] An argument put forward in the code comments in this most recent patch, namely that adding an (x) flag requires further revisions of "14.3.3 Rules" in the documentation, does have some merit. It would be complicated to combine (x) with other flags in the same substitution step, and even more convoluted to try to explain it. I think it's preferable to treat it more like a command substitution ala $(...). > To recall - the ${|func;} substitution runs function "func" and > substitutes (returned string in=E2=80=A6) $REPLY after it has completed, > without (!) doing forks, which is a performance and functionality > benefit over currently available equivalent: $(func;print -rn -- > $REPLY). One of the significant bits from the previous thread was the notion that the mksh syntax is actually ${|command} rather than just limited to functions. I looked at Sebastian's later patch (workers/44742) that tried to implement this, but I think calling bin_eval() isn't necessary. Also in that thread Stephane points out that it would be ideal if (paraphrasing his example) "${| echo { }" were parsed similarly to "{ echo { }" and that to do so would require changes to the parser, not just to the substitution process. However, we can get most of the way there with what Sebastian has proposed and any future parser revisions to take this out of paramsubst() would not (I think) need to invalidate code written to this first approximation. The other thing that bothered me about the idea is the hardcoded reliance on $REPLY, so I took a stab at something to address that. Given the foregoing, here's a proposed alternative to Sebastian's patch. Formal doc and tests pending reaction. Informally, ${|code} passes the code through execstring() and then substitutes the value of $REPLY. ${|VAR|code} passes code through execstring() and then substitutes the value of $VAR. This even works where VAR includes a namespace prefix or a subscript expression, but VAR must otherwise look like a scalar parameter reference. The main limitation on code so interpolated is that it can't contain unquoted { or } ... multi-line code is OK. A remark about the last hunk of the patch: I kept this from Sebastian's original patch, it has the effect that ${|code} never appears to be an unset parameter, even if that code does not set REPLY. I'm not certain that's actually necessary. --000000000000f5471b05ff9f9542 Content-Type: text/plain; charset="US-ASCII"; name="mksh-exec-subst-plus.txt" Content-Disposition: attachment; filename="mksh-exec-subst-plus.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ljnmtcwa0 ZGlmZiAtLWdpdCBhL1NyYy9zdWJzdC5jIGIvU3JjL3N1YnN0LmMKaW5kZXggMTQ5NDdhZTM2Li5j NWMwNjBkNTYgMTAwNjQ0Ci0tLSBhL1NyYy9zdWJzdC5jCisrKyBiL1NyYy9zdWJzdC5jCkBAIC0x ODYwLDYgKzE4NjAsOCBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIg KipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAogICAgICAqIGpvaW5pbmcgdGhlIGFycmF5IGlu dG8gYSBzdHJpbmcgKGZvciBjb21wYXRpYmlsaXR5IHdpdGgga3NoL2Jhc2gpLgogICAgICAqLwog ICAgIGludCBxdW90ZWRfYXJyYXlfd2l0aF9vZmZzZXQgPSAwOworICAgIC8qIEluZGljYXRlcyAk e3wuLi47fSAqLworICAgIGNoYXIgKnJwbHl2YXIgPSBOVUxMOwogCiAgICAgKnMrKyA9ICdcMCc7 CiAgICAgLyoKQEAgLTE4ODcsOCArMTg4OSw1MyBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExp bmtOb2RlIG4sIGNoYXIgKipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAogICAgICAqIGZsYWdz IGluIHBhcmVudGhlc2VzLCBidXQgYWxzbyBvbmUga3NoIGhhY2suCiAgICAgICovCiAgICAgaWYg KGMgPT0gSW5icmFjZSkgeworCS8qIFRoZSBjb21tYW5kIHN0cmluZyB0byBiZSBydW4gYnkgJHt8 Li4uO30gKi8KKwljaGFyICpjbWRhcmcgPSBOVUxMOworCXNpemVfdCBzbGVuID0gMDsKIAlpbmJy YWNlID0gMTsKIAlzKys7CisKKyAgICAgICAgLyogU2hvcnQtcGF0aCBmb3IgdGhlIGNvbW1hbmQt cnVubmluZyBzdWJzdGl0dXRpb24gJHt8Y21kO30KKyAgICAgICAgICogVGhlIGNvbW1hbmQgc3Ry aW5nIGlzIGV4dHJhY3RlZCBhbmQgZXhlY3V0ZWQsIGFuZCB0aGUKKyAgICAgICAgICogc3Vic3Rp dHV0aW9uIGFzc2lnbmVkLiBUaGVyZSdzIG5vICguLi4pLWZsYWdzIHByb2Nlc3NpbmcsCisgICAg ICAgICAqIGkuZS4gbm8gJHt8KFUpY21kO30sIGJlY2F1c2UgaXQgbG9va3MgcXVpdGUgYXdmdWwg YW5kCisgICAgICAgICAqIGFsc28gcmVxdWlyZXMgYSBjaGFuZ2UgdG8gdGhlIG1hbnVhbCBkZXNj cmlwdGlvbiBvZiB0aGUKKyAgICAgICAgICogc3Vic3RpdHV0aW9uIG9yZGVyLiBVc2UgJHsoVSkk e3xjbWQ7fX0gaW5zdGVhZCwgaXQgbG9va3MKKyAgICAgICAgICogY2xlYW5lci4gKi8KKwlpZiAo KnMgPT0gQmFyICYmICgoc2xlbiA9IHN0cmxlbihzKSAtIDEpID4gMSkpIHsKKwkgICAgY2hhciAq b3V0YnJhY2VwID0gcyArIHNsZW47CisJICAgIGlmIChvdXRicmFjZXBbMF0gPT0gT3V0YnJhY2Ug LyogJiYgb3V0YnJhY2VwWy0xXSA9PSAnOycgKi8pIHsKKwkJCisJCWlmICgocnBseXZhciA9IGl0 eXBlX2VuZChzKzEsIElOQU1FU1BDLCAwKSkpIHsKKwkJICAgIGlmICgqcnBseXZhciA9PSBJbmJy YWNrICYmCisJCQkocnBseXZhciA9IHBhcnNlX3N1YnNjcmlwdCgrK3JwbHl2YXIsIDEsICddJykp KQorCQkJKytycGx5dmFyOworCQl9CisJCWlmIChycGx5dmFyID09IHMrMSAmJiAqcnBseXZhciA9 PSBCYXIpIHsKKwkJICAgIC8qIElzICR7fHwuLi59IGEgc3VidGl0dXRpb24gZXJyb3Igb3IgYSBz eW50YXggZXJyb3I/CisJCSAgICB6ZXJyKCJiYWQgc3Vic3RpdHV0aW9uIik7CisJCSAgICByZXR1 cm4gTlVMTDsKKwkJICAgICovCisJCSAgICBycGx5dmFyID0gTlVMTDsKKwkJfQorCQlpZiAocnBs eXZhciAmJiAqcnBseXZhciA9PSBCYXIpIHsKKwkJICAgIGNtZGFyZyA9IGR1cHN0cnBmeChycGx5 dmFyKzEsIG91dGJyYWNlcC1ycGx5dmFyLTEpOworCQkgICAgcnBseXZhciA9IGR1cHN0cnBmeChz KzEscnBseXZhci1zLTEpOworCQl9IGVsc2UgeworCQkgICAgY21kYXJnID0gZHVwc3RycGZ4KHMr MSwgb3V0YnJhY2VwLXMtMSk7CisJCSAgICBycGx5dmFyID0gIlJFUExZIjsKKwkJfQorCQlzID0g b3V0YnJhY2VwOworCSAgICB9CisJfQorCisJaWYgKHJwbHl2YXIgJiYgY21kYXJnICYmICpjbWRh cmcpIHsKKwkgICAgLyogRXhlY3V0ZSB0aGUgc2hlbGwgY29tbWFuZCAqLworCSAgICB1bnRva2Vu aXplKGNtZGFyZyk7CisJICAgIGV4ZWNzdHJpbmcoY21kYXJnLCAxLCAwLCAiY21kc3Vic3QiKTsK KwkgICAgcyA9IGR5bmNhdChycGx5dmFyLCBzKTsKKwl9CisKIAkvKgogCSAqIEluIGtzaCBlbXVs YXRpb24gYSBsZWFkaW5nIGAhJyBpcyBhIHNwZWNpYWwgZmxhZyB3b3JraW5nCiAJICogc29ydCBv ZiBsaWtlIG91ciAoaykuICBUaGlzIGlzIHRydWUgb25seSBmb3IgYXJyYXlzIG9yCkBAIC0yNTg4 LDggKzI2MzUsMTEgQEAgcGFyYW1zdWJzdChMaW5rTGlzdCBsLCBMaW5rTm9kZSBuLCBjaGFyICoq c3RyLCBpbnQgcXQsIGludCBwZl9mbGFncywKIAkJCSAgICAgICgodW5zZXQoS1NIQVJSQVlTKSB8 fCBpbmJyYWNlKSA/IDEgOiAtMSkpLAogCQkJICAgICBzY2FuZmxhZ3MpKSB8fAogCSAgICAodi0+ cG0gJiYgKHYtPnBtLT5ub2RlLmZsYWdzICYgUE1fVU5TRVQpKSB8fAotCSAgICAodi0+ZmxhZ3Mg JiBWQUxGTEFHX0VNUFRZKSkKLQkgICAgdnVuc2V0ID0gMTsKKwkgICAgKHYtPmZsYWdzICYgVkFM RkxBR19FTVBUWSkpCXsKKwkgICAgaWYgKCFycGx5dmFyKSB7CisJCXZ1bnNldCA9IDE7CisJICAg IH0KKwl9CiAKIAlpZiAod2FudHQpIHsKIAkgICAgLyoK --000000000000f5471b05ff9f9542--