|
Boost : |
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-02-16 19:11:33
Paul Mensonides wrote:
> I was trying to summarize the notational conventions that were used throughout
> the document. I suppose that I could avoid the forward references here, and
> just introduce the notations when I introduce the concepts.
>
Probably better (I knew your notation already when starting proof-reading, so what you really need is a virgin reader).
> Except for unused conditional compilation blocks, all tokens between directives
> are scanned for macro expansion.
>
Straight enough.
> Well, I got complaints before about glossing over blue paint, so I'm trying to
> be explicit. At the same time, I'm trying to maintain the algorithm's
> point-of-view. How about:
>
> If the current token is an identifier that refers to a macro, the preprocessor
> must check to see if it is painted. If an identifier token is painted, it means
> that the preprocessor will not attempt to expand it as a macro. In other words,
> the token itself is flagged as disabled and behaves like an identifier that does
> not correspond to a macro. This disabled flag is commonly referred to as "blue
> paint", and thus a token that is marked as disabled is called "painted." (The
> means by which an identifier token can become painted is describd below.) If
> the current token is painted, the preprocessor outputs the token and moves on to
> the next.
>
The paragraph has a *much* better flow now, IMO.
>>>>>function-like macro has no formal
>>>>>parameters, and therefore any use of the stringizing operator is
>>>>>automatically an error.) The result of token-pasting in F's
>>>>>replacement list is
>>>>
>>>>It's not clear to me why the stringizing operator leads to an
>>>>error rather than a '#' character. Probably too much of a
>>>>sidenote, anyway.
>>>
>>>
>>>I don't know the rationale for why it is the way it is.
>>
>>In this case, "therefore" is a bit strange...
>
>
> I don't know. It is fairly cause-and-effect. If you use the stringizing
> operator in a nullary function-like macro, it is an error. For the same reason,
> if you use the stringizing operator in a non-nullary function-like macro without
> applying it to an instance of a formal parameter, it is an error.
>
No strong opinion, here. But while we're at it -- what about
# define CHAOS_IP_HASH_I #
?
>
>>>>>[Interleaved Invocations]
>>>>>
>>>>>It is important to note that disabling contexts only exist
>>>>>during a _single_ scan.
>>>>>Moreover, when scanning passes the end of a disabling
>>>>>context, that
>>>>>disabling context no longer exists. In other words, the
>>>>>output of a
>>>>>scan results only in tokens and whitespace separations. Some of
>>>>>those tokens might be painted (and they remain painted), but
>>>>>disabling contexts are not part of the result of scanning.
>>>>
>>>>>(If they were, there would be no need for blue paint.)
>>>>
>>>>Misses (at least) a reference to 16.3.4-1 (the wording "with
>>>>the remaining tokens of the source" (or so) is quite nice
>>>>there, so consider using something similar).
>>>
>>I have to clarify: I'm missing a hint (in the text not the
>>examples) that tokens from outside the replacement list can
>>form a macro invocation together with expansion output. The
>>sentence from 16.3.4-1 is actually quite good.
>
>
> I think that any need for this (i.e. such a hint) is symptomatic of trying to
> view macros like functions (e.g. F calls G, G returns 1 to F, F returns 1 to
> whatever called F). I'm in favor of doing anything that I can do to eradicate
> this preconception.
I disagree.
If you don't want people to think of macros as functions it's important to point out the differences as clear as possible.
It's quite easy to come up with a simple and stupid text replacement mechanism that does *not* have this behaviour without wasting a single thought on functions.
>
> At the same time, it is worth noting that the syntax of macro invocations is
> dynamic. That is, a series of macro invocations cannot be parsed into a syntax
> tree and then evaluated. It can only parse one invocation at a time, and its
> result is basically appended to the input.
>
The terms 'invocation' and 'function-like macro' are probably much worse than wasting some words on how dynamic things really are...
Regards,
Tobias
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk