Bresticker, Shalom wrote: > 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. What about the following: `define M1(a) `M2('"a'") This is a bit interesting in that the answer relates to how and when arguments are applied. I don't think I'd want the '" to lose its special nature in the above case. Talking about this is going to touch on things that Eric and I chat about from time to time -- when is text simply "characters" and when is it "tokens". Gord. > > 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. -- -------------------------------------------------------------------- Gordon Vreugdenhil 503-685-0808 Model Technology (Mentor Graphics) gordonv@model.com -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.Received on Mon Nov 26 08:44:53 2007
This archive was generated by hypermail 2.1.8 : Mon Nov 26 2007 - 08:45:03 PST