9front - general discussion about 9front
 help / color / mirror / Atom feed
From: ori@eigenstate.org
To: 9front@9front.org
Subject: Re: [9front] Re: commit 2f8a59f4b5bfe028c022855acc19666d69eed909
Date: Fri, 09 Jul 2021 10:21:25 -0400	[thread overview]
Message-ID: <968C3349B9F65B001E188F845EBD631C@eigenstate.org> (raw)
In-Reply-To: <YOf/V9QOmOno33rk@alice>

Quoth Anthony Martin <ality@pbrane.org>:
> > rc: add subshell-function syntax
> >
> > fn foo @{bar} is now equivalent to
> > fn foo {@{bar}}. As a side effect,
> > this disallows creating functions
> > named after keywords without first
> > quoting them.
> 
> Respectfully, this is just wrong. @ is a
> unary operator. Repurposing it to define
> a new special kind of function is a bit
> much.
> 
> What does this buy you over being explicit
> at the call site?
> 
> 	fn foo { bar }
> 
> 	@foo
> 
> One color of function is enough. What's
> next?
> 
> 	fn foo !{ bar }
> 
> to mean that foo always negates the exit
> status of its body?
> 
> The new quoting requirement for functions
> named after keywords seems fine, on the
> other hand. But is it worth the backwards
> incompatibility?
> 
> Thanks,
>   Anthony
> 

You know, that's an interesting point.
We can make the language more regular by
simply removing the special case around
function bodies, and making  them behave
the same as if, while, etc.

It costs us this syntax:

	fn list of functions { ... }

and requires us to be explicit:

	fn (list of functions) { ... }

but on the other hand, things like

	fn foo echo hi
	fn foo @{echo hi}
	fn foo !bar
	fn foo !{bar}

etc all work, just as they would
in the body of any other statement.=

AND it simplifies the code.

It'd take some care moving forward
with this, but it looks like there
aren't very many places this is used;
I've found one in our source tree, in
ircrc:

--- //.git/fs/object/2f8a59f4b5bfe028c022855acc19666d69eed909/tree//rc/bin/ircrc
+++ /rc/bin/ircrc
@@ -16,7 +16,7 @@
 	exit 'hang up'
 }
 
-fn sigint sigterm {
+fn (sigint sigterm) {
 	if (! ~ $#netdir 0)
 		echo  QUIT : Leaving... > $netdir/data
 }
--- //.git/fs/object/2f8a59f4b5bfe028c022855acc19666d69eed909/tree/sys/src/cmd/rc/syn.y
+++ sys/src/cmd/rc/syn.y
@@ -2,7 +2,7 @@
 %term WORD REDIR DUP PIPE SUB
 %term SIMPLE ARGLIST WORDS BRACE PAREN PCMD PIPEFD /* not used in syntax */
 /* operator priorities -- lowest first */
-%left IF WHILE FOR SWITCH ')' NOT
+%left IF WHILE FOR SWITCH ')' NOT FN
 %left ANDAND OROR
 %left BANG SUBSHELL
 %left PIPE
@@ -17,7 +17,7 @@
 	struct tree *tree;
 };
 %type<tree> line paren brace body cmdsa cmdsan assign epilog redir
-%type<tree> cmd simple first word comword keyword words comwords
+%type<tree> cmd simple first word comword keyword words
 %type<tree> NOT FOR IN WHILE IF TWIDDLE BANG SUBSHELL SWITCH FN
 %type<tree> WORD REDIR DUP PIPE
 %%
@@ -68,10 +68,7 @@
 |	assign cmd %prec BANG	{$$=mung3($1, $1->child[0], $1->child[1], $2);}
 |	BANG cmd		{$$=mung1($1, $2);}
 |	SUBSHELL cmd		{$$=mung1($1, $2);}
-|	FN comwords brace	{$$=tree2(FN, $2, $3);}
-|	FN comwords SUBSHELL brace
-				{$$=tree2(FN, $2, mung1($3, $4));}
-|	FN comwords		{$$=tree1(FN, $2);}
+|	FN word cmd		{$$=tree2(FN, $2, $3);}
 simple:	first
 |	simple word		{$$=tree2(ARGLIST, $1, $2);}
 |	simple redir		{$$=tree2(ARGLIST, $1, $2);}
@@ -92,5 +89,3 @@
 keyword: FOR|IN|WHILE|IF|NOT|TWIDDLE|BANG|SUBSHELL|SWITCH|FN
 words:				{$$=(struct tree*)0;}
 |	words word		{$$=tree2(WORDS, $1, $2);}
-comwords:			{$$=(struct tree*)0;}
-|	comwords comword	{$$=tree2(WORDS, $1, $2);}


  reply	other threads:[~2021-07-09 14:34 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-09  7:48 Anthony Martin
2021-07-09 14:21 ` ori [this message]
2021-07-09 14:37 ` Stanley Lieber
2021-07-09 14:56   ` ori
2021-07-09 15:01   ` ori
2021-07-09 15:10     ` Stanley Lieber
2021-07-09 19:43       ` hiro
2021-07-09 20:44         ` hiro
2021-07-09 20:50           ` Stanley Lieber
2021-07-10  7:25             ` hiro
2021-07-10 14:16               ` Stanley Lieber
2021-08-27 15:07 ` ori
2021-09-01 19:16   ` Noam Preil

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=968C3349B9F65B001E188F845EBD631C@eigenstate.org \
    --to=ori@eigenstate.org \
    --cc=9front@9front.org \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).