Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Minor bug(s) with NO_MULTI_FUNC_DEF



Peter Stephenson wrote on Tue, May 31, 2022 at 10:03:17 +0100:
> On 30 May 2022 at 21:31 Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> 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
>  >}
> 




Messages sorted by: Reverse Date, Date, Thread, Author