From: Daniel Shahaf <d.s@daniel.shahaf.name> To: zsh-workers@zsh.org Subject: Re: Minor bug(s) with NO_MULTI_FUNC_DEF Date: Thu, 2 Jun 2022 10:23:09 +0000 [thread overview] Message-ID: <20220602102309.GF28173@tarpaulin.shahaf.local2> (raw) In-Reply-To: <1980097513.514587.1653987797049@mail2.virginmedia.com> Peter Stephenson wrote on Tue, May 31, 2022 at 10:03:17 +0100: > On 30 May 2022 at 21:31 Bart Schaefer <schaefer@brasslantern.com> wrote: > > As an aside, something like this: > > > > TRAP{HUP,INT,QUIT,TERM} () { print -u2 Got $1 } > > > > bypasses the nomultifuncdef syntax check and successfully defines all > > four functions. > > We could probably document our way out here. It is a single command > line word in origin so the intention must be the obvious one. Devil's advocate: letting this syntax bypass the NO_MULTI_FUNC_DEF check would break the invariant that «foo bar baz qux» and «foo {bar,baz} qux» are always equivalent. So, if we document it, I'd rather it were documented as "This may change in the future" than as a feature. Cheers, Daniel > > diff --git a/Src/hashtable.c b/Src/hashtable.c > index bb165505e..74e838829 100644 > --- a/Src/hashtable.c > +++ b/Src/hashtable.c > @@ -942,10 +942,11 @@ printshfuncnode(HashNode hn, int printflags) > putchar('\n'); > return; > } > - > + > + printf("function "); > quotedzputs(f->node.nam, stdout); > if (f->funcdef || f->node.flags & PM_UNDEFINED) { > - printf(" () {\n"); > + printf(" {\n"); > zoutputtab(stdout); > if (f->node.flags & PM_UNDEFINED) { > printf("%c undefined\n", hashchar); > @@ -983,7 +984,7 @@ printshfuncnode(HashNode hn, int printflags) > } > printf("\n}"); > } else { > - printf(" () { }"); > + printf(" { }"); > } > if (f->redir) { > t = getpermtext(f->redir, NULL, 1); > diff --git a/Src/text.c b/Src/text.c > index 5cd7685fd..89de27ea5 100644 > --- a/Src/text.c > +++ b/Src/text.c > @@ -578,11 +578,16 @@ gettext2(Estate state) > Wordcode end = p + WC_FUNCDEF_SKIP(code); > int nargs = *state->pc++; > > - taddlist(state, nargs); > - if (nargs) > + if (nargs) { > + taddstr("function "); > + taddlist(state, nargs); > taddstr(" "); > + } else { > + /* Anonymous function */ > + taddstr("() "); > + } > if (tjob) { > - taddstr("() { ... }"); > + taddstr("{ ... }"); > state->pc = end; > if (!nargs) { > /* > @@ -594,7 +599,7 @@ gettext2(Estate state) > } > stack = 1; > } else { > - taddstr("() {"); > + taddstr("{"); > tindent++; > taddnl(1); > n = tpush(code, 1); > diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst > index 0312fe94e..719a43c3d 100644 > --- a/Test/A01grammar.ztst > +++ b/Test/A01grammar.ztst > @@ -80,7 +80,7 @@ > functions -x3 fn > fn > 0:End of sublist containing ! with no command > ->fn () { > +>function fn { > > : && ! > > : > >} > @@ -95,7 +95,7 @@ > functions -x2 fn > fn > 0:exclamation marks without following commands > ->fn () { > +>function fn { > > ! { > > ! > > } && ! ( > @@ -473,19 +473,19 @@ > fn3() { ( echo foo; ) } > functions fn1 fn2 fn3 > 0:Output of syntactic structures with and without always blocks > ->fn1 () { > +>function fn1 { > > { > > echo foo > > } > >} > ->fn2 () { > +>function fn2 { > > { > > echo foo > > } always { > > echo bar > > } > >} > ->fn3 () { > +>function fn3 { > > ( > > echo foo > > ) > @@ -776,7 +776,7 @@ F:Note that the behaviour of 'exit' inside try-list inside a function is unspeci > fn abecedinarian > fn xylophone) > 0: case word handling in sh emulation (SH_GLOB parentheses) > ->fn () { > +>function fn { > > case $1 in > > (one | two | three) print Matched $1 ;; > > (fo* | fi* | si*) print Pattern matched $1 ;; > @@ -846,7 +846,7 @@ F:Note that the behaviour of 'exit' inside try-list inside a function is unspeci > which fn > fn > 0:Long case with parsed alternatives turned back into text > ->fn () { > +>function fn { > > typeset ac_file="the else branch" > > case $ac_file in > > (*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj) ;; > diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst > index 17f6dfa29..855c44782 100644 > --- a/Test/A04redirect.ztst > +++ b/Test/A04redirect.ztst > @@ -230,7 +230,7 @@ > eval $'fn-varid() { print {\x18}<<0 }' > { which -x2 fn-varid; fn-varid } | tr $'\x18' '?' > 0:Regression test for off-by-one in varid check > ->fn-varid () { > +>function fn-varid { > > print {?} <<0 > >0 > >} > @@ -575,7 +575,7 @@ > > which redirfn > 0:text output of function with redirections > ->redirfn () { > +>function redirfn { > > local var > > read var > > print I want to tell you about $var > @@ -653,7 +653,7 @@ > fn-two-heres > print $functions[fn-two-heres] > 0:Two here-documents in a line are shown correctly. > ->fn-two-heres () { > +>function fn-two-heres { > > cat <<x <<y > >foo > >x > @@ -679,7 +679,7 @@ > which fn-here-pipe > 0:Combination of HERE-document and |& > >FOO > ->fn-here-pipe () { > +>function fn-here-pipe { > > cat <<HERE 2>&1 | cat > >FOO > >HERE > diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst > index d95ee363c..22c84aaec 100644 > --- a/Test/A05execution.ztst > +++ b/Test/A05execution.ztst > @@ -272,7 +272,7 @@ F:anonymous function, and a descriptor leak when backgrounding a pipeline > 0: > >No output yet > >Autoloaded ksh style > ->autoload_redir () { > +>function autoload_redir { > > print Autoloaded ksh style > >} > autoload.log > > diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst > index 8b3988151..7ec43adee 100644 > --- a/Test/B02typeset.ztst > +++ b/Test/B02typeset.ztst > @@ -797,10 +797,10 @@ > fn2() { typeset assignfirst=(why not); } > which -x2 fn2 > 0:text output from typeset > ->fn () { > +>function fn { > > typeset foo bar thing=this stuff=(that other) more=woevva > >} > ->fn2 () { > +>function fn2 { > > typeset assignfirst=(why not) > >} > > diff --git a/Test/C02cond.ztst b/Test/C02cond.ztst > index 4366b4142..502365d05 100644 > --- a/Test/C02cond.ztst > +++ b/Test/C02cond.ztst > @@ -355,7 +355,7 @@ F:scenario if you encounter it. > } > which crashme > 0:Regression test for examining code with regular expression match > ->crashme () { > +>function crashme { > > if [[ $1 =~ ^http:* ]] > > then > > url=${1#*=} > @@ -424,7 +424,7 @@ F:scenario if you encounter it. > fn() { [[ 'a' == 'b' || 'b' = 'c' || 'c' != 'd' ]] } > which -x2 fn > 0: = and == appear as input > ->fn () { > +>function fn { > > [[ 'a' == 'b' || 'b' = 'c' || 'c' != 'd' ]] > >} > > diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst > index f120809a7..6483494d3 100644 > --- a/Test/C03traps.ztst > +++ b/Test/C03traps.ztst > @@ -101,13 +101,13 @@ > } > fn1 > 0: Nested TRAPINT, not triggered > ->TRAPINT () { > +>function TRAPINT { > > print INT1 > >} > ->TRAPINT () { > +>function TRAPINT { > > print INT2 > >} > ->TRAPINT () { > +>function TRAPINT { > > print INT1 > >} > > @@ -391,10 +391,10 @@ > fn2 > fn1') > 0:POSIX_TRAPS option > ->TRAPEXIT () { > +>function TRAPEXIT { > > print Exited > >} > ->TRAPEXIT () { > +>function TRAPEXIT { > > print No, really exited > >} > >No, really exited > diff --git a/Test/C04funcdef.ztst b/Test/C04funcdef.ztst > index af469c527..2f8ee1fe3 100644 > --- a/Test/C04funcdef.ztst > +++ b/Test/C04funcdef.ztst > @@ -259,7 +259,7 @@ > } > functions fn > 0:Text representation of anonymous function with arguments > ->fn () { > +>function fn { > > () { > > print Anonymous function 1 $* > > } with args > @@ -321,7 +321,7 @@ > barexpansion() { print This is the correct output.; } > funcwithalias > 0:Alias expanded in command substitution does not appear expanded in text > ->funcwithalias () { > +>function funcwithalias { > > echo $(fooalias) > >} > >This is the correct output. > @@ -348,7 +348,7 @@ > ) > 0:autoload containing eval > >oops was successfully autoloaded > ->oops () { > +>function oops { > > print oops was successfully autoloaded > >} > > diff --git a/Test/C05debug.ztst b/Test/C05debug.ztst > index 9a8df1dad..3a428cba0 100644 > --- a/Test/C05debug.ztst > +++ b/Test/C05debug.ztst > @@ -137,7 +137,7 @@ > >6: 'x=y ' > >7: 'print $x' > >y > ->8: 'fn2 () { > +>8: 'function fn2 { > > echo wow > >}' > >9: 'fn2' > diff --git a/Test/E02xtrace.ztst b/Test/E02xtrace.ztst > index 56bc20f1a..59cdfdc5b 100644 > --- a/Test/E02xtrace.ztst > +++ b/Test/E02xtrace.ztst > @@ -164,19 +164,19 @@ > " > done > 0:a function that redefines itself preserves tracing > ->f () { > +>function f { > > # traced > > echo inner > >} > ->foo-bar () { > +>function foo-bar { > > # traced > > echo inner > >} > ->$'\M-c\M-\C-C\M-\C-L' () { > +>function $'\M-c\M-\C-C\M-\C-L' { > > # traced > > echo inner > >} > ->$'ba\C-@z' () { > +>function $'ba\C-@z' { > > # traced > > echo inner > >} > @@ -192,7 +192,7 @@ > functions f > f > 0:define traced function: named function > ->f () { > +>function f { > > # traced > > echo traced named function > >} >
next prev parent reply other threads:[~2022-06-02 10:46 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-05-30 20:31 Bart Schaefer 2022-05-31 9:03 ` Peter Stephenson 2022-05-31 17:07 ` Bart Schaefer 2022-05-31 17:14 ` Bart Schaefer 2022-06-06 8:45 ` Peter Stephenson 2022-06-06 15:53 ` Peter Stephenson 2022-06-02 10:23 ` Daniel Shahaf [this message] 2022-06-02 15:23 ` Bart Schaefer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220602102309.GF28173@tarpaulin.shahaf.local2 \ --to=d.s@daniel.shahaf.name \ --cc=zsh-workers@zsh.org \ --subject='Re: Minor bug(s) with NO_MULTI_FUNC_DEF' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Code repositories for project(s) associated with this inbox: https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).