Alternate string literal syntax (with mixins)?
Kristian Kilpi
kjkilpi at gmail.com
Sun Feb 11 11:15:32 PST 2007
On Sun, 11 Feb 2007 20:08:59 +0200, Andrei Alexandrescu (See Website For
Email) <SeeWebsiteForEmail at erdani.org> wrote:
> Johan Granberg wrote:
>> Johan Granberg wrote:
>>
>>> Kristian Kilpi wrote:
>>>
>>>> String literals with mixins are a bit awkward sometimes (editor
>>>> highlighting etc).
>>>>
>>>> Some special marks -- I use @{ }@ here -- could be used to mark a
>>>> part of
>>>> a source file as a string literal, just like /* */ marks a part of
>>>> code
>>>> as a comment. For example:
>>>>
>>>> mixin(
>>>> @{
>>>> //this is a string literal block
>>>> if(...) {
>>>> ...
>>>> }
>>>> }@
>>>> );
>>>>
>>>> The @{ }@ marks have a close relation, of course, with quotation marks
>>>> "". But because there is a starting mark and an ending mark, you can
>>>> nest
>>>> them. (And because they are used to mark a part of a file as a string
>>>> literal, they are not actually the part of the 'working code' just
>>>> like
>>>> the "" literals are, if you get what I'm trying to say.)
>>>>
>>>> E.g.
>>>>
>>>> alias @{
>>>> str = @{ foo }@ ~ @{ bar }@;
>>>> str ~= "blah";
>>>> if(...) {
>>>> ...
>>>> }
>>>> }@ MyCode;
>>>>
>>>> mixin(MyCode);
>>> Wouldn't it be a better solution if the escape syntax you described
>>> represented a custom format that mixins was thought to handle? What I'm
>>> thingking is something like lisps quotes, then the escaped code could
>>> be
>>> tokenized and we could modify tokens instead of strings. (for a small
>>> fraction of cases the string might be better but then we could have the
>>> current syntax)
>> While I'm at it I might suggest using <[ and ]> as tokens instead of
>> @{.
>> This is the tokens used in nemerle (if I understood their manual right)
>> and
>> it is unnecessary to use a different token just because.
>> http://nemerle.org/Syntax_extensions
>
> Probably best is to use one group of symbols that nest naturally (e.g.
> [] or () or {}) and prefix them with something that unambiguously
> denotes a string:
>
> alias ${
> ... anything with balanced {}'s ...
> ... or with unbalanced \{ and \}'s ...
> } MyCode;
>
> or:
>
> alias $(
> ... anything with balanced ()'s ...
> ... or with unbalanced \( and \)'s ...
> ) MyCode;
>
> or:
>
> alias $[
> ... anything with balanced []'s ...
> ... or with unbalanced \[ and \]'s ...
> ] MyCode;
>
> This should reasonably cover applications elegantly, especially because
> code tends to not have three kinds of unbalanced parens at the same time
> :o).
>
>
> Andrei
Actually I was first considering a @{ } syntax. Then I decided to add the
second @ (i.e. @{ }@ ) so that unbalanced curly bracets would be allowed
without escape sequencing them (e.g. \{ \} ). This allows one to construct
strings from smaller parts containing unbalanced parens that would
otherwise be balanced, e.g.:
@{ if(...) { }@ ~ Block!() ~ @{ } }@
->
" if(...) { " ~ Block!() ~ " } "
Well, a syntax with only one @ (or $) looks nicer though.
The second thing I was considering (with the @{ } syntax) was a different
way to create user defined string literals, e.g.:
@MyCode {
...
}
mixin(@MyCode);
User defined literals would then belong to their own unique namespace
(@MyCode versus MyCode), which could be nice (or not).
More information about the Digitalmars-d
mailing list