Alternate string literal syntax (with mixins)?

Bill Baxter dnewsgroup at billbaxter.com
Sun Feb 11 22:13:34 PST 2007


Andrei Alexandrescu (See Website For Email) wrote:
> 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.

I like these ideas.
Here's another thought -- just let "mixin" be followed directly by a 
string literal.

Then this:
#    mixin(
#      @{
#        //this is a string literal block
#        if(...) {
#          ...
#        }
#      }@
#    );

becomes:
#    mixin@{
#        //this is a string literal block
#        if(...) {
#          ...
#        }
#    }@;


  (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);

I like this too.

Related but somewhat different would be the concept of importing chunks 
from the /current/ file.
Now with import("foo.txt") we can import the entire contents of an 
arbitrary file as a string, but that introduces some distance between 
the content and where it is used.  Sometimes you want locality.  Say 
I've got a little 5-line shader program that I'm using.  In c++ I'll 
often start out putting it in the same file near the point of use with 
an embedded string.  Despite code in strings being kind of a pain to 
work with, it's still less annoying than going back and forth between 
two files to make sure I keep the parameter names in the C++ file in 
sync with shader code as I tweak things.

Maybe your string alias idea is enough for that.  I think the wisdom of 
perl, though, is that if the token delimiting start-of-string is fixed, 
then as soon as you start manipulating code that manipulates code, you 
end up finding you want to embed that very token in a text literal, and 
need to escape it.  Using nest-able symbols helps but doesn't solve the 
problem if you want to have a literal "@{" without it's mate in the 
block.  It's the same reason you wanted to have @{ }@,  so you could 
nest { and } independantly.  The same need will arise for @{ and }@.

Perl's solution ("here documents") is to make it possible to make unique 
delimiters that are very much less likely to clash with anything in 
arbitrary code fragments:

<<"SomeUniqueStringICameUpWithToSignalTheEND";
stuff here
more "stuff"
    whitespace is all significant
    "quotes" don't matter
SomeStringICameUpWithToSignalTheEND


I don't care what the syntax is, but if I'm going to be manipulating 
lots of quoted code, I want something like Perl's here documents, so 
that I can paste anything I want in between the start and end markers 
and know that it'll just work (with 1-epsilon probability).

It might also be nice to combine that with the import chunk idea so that 
the label could be used to import the chunk:

    import(SomeUniqueStringICameUpWithToSignalTheEND);

--bb



More information about the Digitalmars-d mailing list