Alternate string literal syntax (with mixins)?

Andrei Alexandrescu (See Website For Email) SeeWebsiteForEmail at erdani.org
Sun Feb 11 11:25:43 PST 2007


Kristian Kilpi wrote:
> 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.

And Perl programmers will love it. :o) Perl probably has the most 
comprehensive string notation capabilities, and it's very well thought out.


Andrei



More information about the Digitalmars-d mailing list