RE: [sv-bc] Mantis 1571: proposal for macro defaults

From: Bresticker, Shalom <shalom.bresticker_at_.....>
Date: Mon Nov 26 2007 - 08:35:33 PST
You're correct, of course. I thought I had done those changes after
copy-pasting the line. 

I would like to add a sentence that the special combinations `", ``, and
`\ in actual arguments and in defaults are considered normal characters
and do not have the special meanings that they do in macro text.

Shalom

> -----Original Message-----
> From: Gordon Vreugdenhil [mailto:gordonv@model.com] 
> Sent: Monday, November 26, 2007 11:02 AM
> To: Bresticker, Shalom
> Cc: sv-bc
> Subject: Re: [sv-bc] Mantis 1571: proposal for macro defaults
> 
> Shalom,  I think there is an issue with the example:
> 
>     `define MACRO2(a=5, b, c="C") $display(a,,b,,c); ...
>     `MACRO2 (, 2, )     // a and c omitted, replaced by defaults
>                         // expands to '$display(1,,2,,"C");'
>                                                ^^^
> 
>     `MACRO2 (, 2)       // a and c omitted, replaced by defaults
>                         // expands to '$display(1,,2,,"C");'
>                                                ^^^
> 
> The ones in the $display expansions should be fives.
> 
> The rest appears fine.
> 
> Gord.
> 
> 
> 
> Bresticker, Shalom wrote:
> > Hi,
> > 
> > I have attached a revised version of this proposal that deals with 
> > most of the comments received. I left two issues out as 
> being outside 
> > the scope of this Mantis:
> > 
> > 1. Eric wrote:
> > 
> > '* Shalom's proposed change contains the following paragraph:
> > "If formal arguments are used, the list of formal argument 
> names shall 
> > be enclosed in parentheses following the name of the macro. 
> The formal 
> > argument names shall be simple_identifiers, separated by commas and 
> > optionally whitespace. The left parenthesis shall follow the text 
> > macro name immediately, with no space in between."
> > 
> > The LRM allows macros to be named with escaped identifiers. If an 
> > escaped identifier names the macro then one character of 
> white space 
> > (space, tab, newline, eof) must be used to delimit the 
> macro name as 
> > defined in section A.9.3 and A.9.4. First of all, does this 
> make sense?
> > Should language be added that indicates that one, and only 
> one space 
> > character or tab character separate the escaped identifier from the 
> > opening parenthesis?'
> > 
> > However, the text that Eric quotes is not mine, but is in 
> the existing 
> > LRM. It also has no connection to defaults.
> > 
> > 2. Greg wrote:
> > 
> >>    2) So-called "token gluing" (actually implemented as 
> >> token-delimiter
> >>       removal) has to be placed into this evaluation sequence
> >>       carefully.  The LRM describes '' only when it 
> appears in "macro 
> >> text",
> >>       and shows that it is removed sometime after the formal 
> >> substitutions
> >>       for the macro definition in which it appears.  It is 
> probably 
> >> already
> >>       true that gluing can produce tokens which will be subject to 
> >> further
> >>       macro expansion (but not to any further formal 
> substitution, of 
> >> course).
> >>       If it does act on the "literal" text, then it should 
> be able to
> >>       modify expansions latent in such text:
> >>
> >> 	`define CHAR_1  A
> >> 	`define CHAR_2  B
> >> 	`define CHAR_3  C
> >> 	`define CHAR_12 L
> >> 	`define BOT( X, Y, Z )  `" `CHAR_``X``Y``2`CHAR_``X `CHAR_``Z `"
> >>
> >>         `BOT( 1, `CHAR_1, 3 )   expands to  " ALA C "
> > 
> > I left this out as well as being connected to token gluing 
> and not to 
> > defaults.
> > 
> > I put the previous series of comments into the Mantis for easy 
> > reference.
> > 
> > The proposal incorporates changes from Mantis 1957, which 
> was already 
> > approved by SV-BC and practically, also by the Champions.
> > 
> > Please review the new proposal. We don't have much time left.
> > 
> > Thanks,
> > Shalom
> > 
> ---------------------------------------------------------------------
> > Intel Israel (74) Limited
> > 
> > This e-mail and any attachments may contain confidential 
> material for 
> > the sole use of the intended recipient(s). Any review or 
> distribution 
> > by others is strictly prohibited. If you are not the intended 
> > recipient, please contact the sender and delete all copies.
> > 
> > 
> > 
> > 
> ----------------------------------------------------------------------
> > --
> > 
> > Mantis 1571
> > 
> > P1800-2008/D3a
> > 
> > Add defaults for text macro arguments
> > 
> > The proposal is based on
> > 
> > In Section 21.5.1
> > 
> > CHANGE
> > 
> > Change the syntax in Syntax 21-2 from
> > 
> > list_of_formal_arguments ::=
> >     formal_argument_identifier { , formal_argument_identifier } 
> > formal_argument_identifier ::=
> >     simple_identifier
> > 
> > TO
> > 
> > list_of_formal_arguments ::=
> >     formal_argument_identifier { , formal_argument_identifier }
> >     formal_argument { , formal_argument } formal_argument ::=
> >     simple_identifier [ = default_text ] formal_argument_identifier 
> > ::=
> >     simple_identifier
> > 
> > 
> > CHANGE
> > 
> >  
> > 
> > If formal arguments are used, the list of formal argument 
> names shall 
> > be enclosed in parentheses following
> > 
> > the name of the macro. The formal argument names shall be 
> > /simple_identifiers/, separated by commas and
> > 
> > optionally whitespace. The left parenthesis shall follow the text 
> > macro name immediately, with no space in between.
> > 
> > 
> > TO
> > 
> >  
> > 
> > If formal arguments are used, the list of formal argument 
> names shall 
> > be enclosed in parentheses following
> > 
> > the name of the macro. The formal argument names shall be 
> > /simple_identifiers/, separated by commas and
> > 
> > optionally whitespace. The left parenthesis shall follow the text 
> > macro name immediately, with no space in between.
> > 
> > 
> > A formal macro argument may have a default. A default is 
> specified by 
> > appending an "=" symbol after the formal argument name, followed by 
> > the default text. The default text is substituted for the formal 
> > argument if no corresponding actual argument is specified.
> > 
> > The default text may be explicitly specified to be empty by 
> adding an 

> > "=" symbol after the formal argument name, followed by a 
> comma (or a 
> > right parenthesis if it is the last argument in the argument list.)
> > 
> >  
> > 
> >  
> > 
> > CHANGE
> > 
> >  
> > 
> > To use a macro defined with arguments, the name of the text macro 
> > shall be followed by a list of actual arguments in parentheses, 
> > separated by commas. White space shall be allowed between the text 
> > macro name and the left parenthesis.
> > 
> >  
> > 
> > The number of actual arguments shall match the number of formal 
> > arguments. However,  an actual argument may be empty or white space 
> > only, in which case the formal argument is substituted by nothing.
> > Commas must still be used to maintain the correct number of 
> arguments.
> > 
> >  
> > 
> > Example:
> > 
> > `define D(x,y) *initial* $display("start", x , y, "end");
> > 
> >  
> > 
> > `D( "msg1" , "msg2" ) // prints "startmsg1msg2end"
> > 
> > `D( " msg1", )        // prints "start msg1 end"
> > 
> > `D(, "msg2 ")         // prints "start msg2 end"
> > 
> > `D(,)                 // prints "start  end"
> > 
> > `D(  ,  )             // prints "start  end"
> > 
> > `D("msg1")            // illegal, only one argument
> > 
> > `D()                  // illegal, only one empty argument
> > 
> > * *
> > 
> > *(The green text was added by Mantis 1957.)*
> > 
> > TO
> > 
> > To use a macro defined with arguments, the name of the text macro 
> > shall be followed by a list of actual arguments in parentheses, 
> > separated by commas. Actual arguments and defaults shall 
> not contain 
> > comma or right parenthesis characters outside matched pairs of left 
> > and right parentheses (), square brackets [], braces {}, 
> double quotes 
> > "", or an escaped identifier.
> > 
> >  
> > 
> > White space shall be allowed between the text macro name 
> and the left 
> > parenthesis in the macro usage.
> > 
> > If fewer actual arguments are specified than the number of formal 
> > arguments and all the remaining formal arguments have 
> defaults, then 
> > the defaults are substituted for the additional formal 
> arguments. It 
> > shall be an error if any of the remaining formal arguments does not 
> > have a default specified. For a macro with arguments,  the 
> parentheses 
> > are always required in the macro call, even if all the 
> arguments have 
> > defaults. For macros without arguments, it shall be an error to add 
> > parentheses. It shall be an error to specify more actual arguments 
> > than the number of formal arguments.
> > 
> >  
> > 
> > Example without defaults:
> > 
> > `define D(x,y) *initial* $display("start", x , y, "end");
> > 
> >  
> > 
> > `D( "msg1" , "msg2" ) // expands to '*initial* 
> $display("start", "msg1" 
> > , "msg2", "end");' prints "startmsg1msg2end"
> > 
> > `D( " msg1", )        // expands to '*initial* 
> $display("start", " msg1" 
> > , , "end");' prints "start msg1 end"
> > 
> > `D(, "msg2 ")         // expands to '*initial* $display("start",  , 
> > "msg2 ", "end");' prints "start msg2 end"
> > 
> > `D(,)                 // expands to '*initial* 
> $display("start",  , , 
> > "end");' prints "start  end"
> > 
> > `D(  ,  )             // expands to '*initial* 
> $display("start",  , , 
> > "end");' prints "start  end"
> > 
> > `D("msg1")            // illegal, only one argument
> > 
> > `D()                  // illegal, only one empty argument
> > 
> > `D(,,)                // illegal, more actual than formal arguments
> > 
> > Example with defaults:
> > 
> > `define MACRO1(a=5,b="B",c) $display(a,,b,,c);
> > 
> > `MACRO1 ( , 2, 3 )  // argument a omitted, replaced by default
> >                     // expands to '$display(5,,2,,3);'
> > `MACRO1 ( 1 , , 3 ) // argument b omitted, replaced by default
> >                     // expands to '$display(1,,"B",,3);'
> > `MACRO1 ( , 2, )    // ILLEGAL: c omitted, no default
> > `MACRO1 ( 1 )       // ILLEGAL: b and c omitted, no default for c
> > 
> > `define MACRO2(a=5, b, c="C") $display(a,,b,,c);
> > 
> > `MACRO2 (1, , 3)    // ILLEGAL: b omitted, no default
> > `MACRO2 (, 2, )     // a and c omitted, replaced by defaults
> >                     // expands to '$display(1,,2,,"C");'
> > `MACRO2 (, 2)       // a and c omitted, replaced by defaults
> >                     // expands to '$display(1,,2,,"C");'
> > 
> > `define MACRO3(a=5, b=0, c="C") $display(a,,b,,c);
> > `MACRO3 ( 1 )       // b and c omitted, replaced by defaults
> >                     // expands to '$display(1,,0,,"C");'
> > `MACRO3 ( )         // all arguments replaced by defaults
> >                     // expands to '$display(5,,0,,"C");'
> > `MACRO3             // ILLEGAL: parentheses required
> > 
> > CHANGE
> > 
> > Each actual argument is substituted for the corresponding formal 
> > argument literally. Therefore, when an expression is used 
> as an actual 
> > argument, the expression will be substituted in its 
> entirety. This may 
> > cause an expression to be evaluated more than once if the formal 
> > argument was used more than once in the macro text. For example:
> > 
> >  
> > 
> > `define max(a,b)((a) > (b) ? (a) : (b))
> > 
> > n = `max(p+q, r+s) ;
> > 
> > will expand as
> > 
> >  
> > 
> > n = ((p+q) > (r+s)) ? (p+q) : (r+s) ;
> > 
> > Here, the larger of the two expressions p + q and r + s will be 
> > evaluated twice.
> > 
> > TO
> > 
> > Each actual argument is substituted for the corresponding formal 
> > argument literally. Therefore, when an expression is used 
> as an actual 
> > argument, the expression will be substituted in its 
> entirety. This may 
> > cause an expression to be evaluated more than once if the formal 
> > argument was used more than once in the macro text. For example:
> > 
> >  
> > 
> > `define max(a,b)((a) > (b) ? (a) : (b))
> > 
> > n = `max(p+q, r+s) ;
> > 
> > will expand as
> > 
> >  
> > 
> > n = ((p+q) > (r+s)) ? (p+q) : (r+s) ;
> > 
> > Here, the larger of the two expressions p + q and r + s will be 
> > evaluated twice.
> > 
> >  
> > 
> > The macro text and argument defaults may contain usages of 
> other text 
> > macros. Such usages shall be substituted after the outer macro is 
> > substituted, not when it is defined. If an actual argument or an 
> > argument default contains a macro usage, the macro usage shall be 
> > expanded only after substitution into the outer macro text.
> > 
> >  
> > 
> > Note that if a formal argument has a non-empty default and 
> one wants 
> > to replace the formal argument with an empty actual argument, one 
> > cannot simply omit the actual argument, as then the default 
> will be used.
> > However, one can define an empty text macro, say `EMPTY, 
> and use that 
> > as the actual argument. This will be substituted in place of the 
> > formal argument, and will be replaced after expansion by empty text.
> > 
> >  
> > 
> > When a macro usage is passed as an actual argument to 
> another macro, 
> > the argument expansion shall not introduce new uses of the formal 
> > arguments to the top-level macro.
> > 
> >   `define TOP(a,b) a + b
> >   `TOP( `TOP(b,1), `TOP(42,a) )
> > 
> > expands to: b + 1 + 42 + a
> > not into: 42 + a + 1 + 42 + a
> > nor into: b + 1 + 42 + b + 1
> > 
> > It shall be an error for a macro to expand directly or 
> indirectly to 
> > text containing another usage of itself (a recursive macro).
> > 
> 
> --
> --------------------------------------------------------------------
> Gordon Vreugdenhil                                503-685-0808
> Model Technology (Mentor Graphics)                gordonv@model.com
> 
---------------------------------------------------------------------
Intel Israel (74) Limited

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Mon Nov 26 08:37:58 2007

This archive was generated by hypermail 2.1.8 : Mon Nov 26 2007 - 08:38:32 PST