code: plan9front

Download patch

ref: 2f8a59f4b5bfe028c022855acc19666d69eed909
parent: b542dce430d408ed1f7457a26caa1d4bfc7339c4
author: Ori Bernstein <ori@eigenstate.org>
date: Thu Jul 8 17:35:34 EDT 2021

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.

--- a/sys/src/cmd/rc/syn.y
+++ b/sys/src/cmd/rc/syn.y
@@ -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
+%type<tree> cmd simple first word comword keyword words comwords
 %type<tree> NOT FOR IN WHILE IF TWIDDLE BANG SUBSHELL SWITCH FN
 %type<tree> WORD REDIR DUP PIPE
 %%
@@ -68,8 +68,10 @@
 |	assign cmd %prec BANG	{$$=mung3($1, $1->child[0], $1->child[1], $2);}
 |	BANG cmd		{$$=mung1($1, $2);}
 |	SUBSHELL cmd		{$$=mung1($1, $2);}
-|	FN words brace		{$$=tree2(FN, $2, $3);}
-|	FN words		{$$=tree1(FN, $2);}
+|	FN comwords brace	{$$=tree2(FN, $2, $3);}
+|	FN comwords SUBSHELL brace
+				{$$=tree2(FN, $2, mung1($3, $4));}
+|	FN comwords		{$$=tree1(FN, $2);}
 simple:	first
 |	simple word		{$$=tree2(ARGLIST, $1, $2);}
 |	simple redir		{$$=tree2(ARGLIST, $1, $2);}
@@ -90,3 +92,5 @@
 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);}