2.4 Spaces within packs

With "pack" we refer to the following source constructs which are collections of other constructs enclosed between ( and ) symbols:

Spaces are optional after commas in packs when both the preceding and following symbols are tags.

Put a space after commas in packs when the next construct is not a tag, but only if the preceding construct is a tag.

Do not put spaces before commas in packs.

Examples:

{ Spaces are optional around commas surrounded by tags }
process(socket, resp, fragmented);
process(socket,resp,fragmented);
op E = (Symbol a,b) bool: a = b;
op E = (Symbol a, b) bool: a = b;

{ Space after commas separating a non tag and a tag }
op E = (Symbol s, Word w) bool: s E w;
mode M = struct (int i, real r);

{ No spaces in commas separating non tags }
proc(int,string,[]real)int callback;
op(int,int)int handler;
mode Data = union (void,bool,int)