>> * Disabling escapes: If you use single quotes instead of double quotes, 
>> backslash escapes are disabled.
> 
> We need a way to disable escapes, but it seems to me that (since it is 
> orthogonal to the other concerns) that it should not be tied to the “multiple 
> single quotes” syntax.  What is your thought on “modifier” prefix characters 
> for string literals?  e.g.:
> 
>       let x = e”no \escapes \(processed here”
> 
> If we supported these, they would be supported with multi-line string 
> literals by putting the modifiers on the first line of the literal, and the 
> multi-line approach above would “just work”.  You could introduce several 
> different modifiers, e.g. one that disabled general escapes, but still 
> allowed \(x) for substitution.  
> 
>> 3. It might be useful to make multiline `"` strings trim trailing whitespace 
>> and comments like Perl's `/x` regex modifier does.
> 
> If you have modifier characters already, it is easy to build a small zoo full 
> of these useful beasts.

Modifiers are definitely a workable alternative, and can be quite flexible, 
particularly if a future macro system can let you create new modifiers.

(The Perl script I just posted about supports the e"" syntax you're proposing.)

>> * Yes, with a number of backslashes matching the number of quotes, which 
>> allows you to insert literal \( text: '''           
>> <author>\\\(author)</author>
> 
> Egads!

Yeah, that's a little more clever than nice. :^)

>> * Alternative delimiters: If a string literal starts with three, or five, or 
>> seven, or etc. quotes, that is the delimiter, and fewer quotes than that in 
>> a row are simply literal quote marks. Four, six, etc. quotes is a quote mark 
>> abutting the end of the literal.
>> 
>>      let xml: String = """<?xml version="1.0"?>
>>                              """<catalog>
>>                              """\t<book id="bk101" empty="">
>>                              """\t\t<author>\(author)</author>
>>                              """\t</book>
>>                              """</catalog>"""
>> 
>> You can't use this syntax to express an empty string, or a string consisting 
>> entirely of quote marks, but `""` handles empty strings adequately, and 
>> escaping can help with quote marks. (An alternative would be to remove the 
>> abutting rule and permit `""""""` to mean "empty string", but abutting 
>> quotes seem more useful than long-delimiter empty strings.)
> 
> I agree that there is a need to support alternative delimiters, but 
> subjectively, I find this to be pretty ugly.  It is also a really unfortunate 
> degenerate case for “I just want a large blob of XML” because you’d end up 
> using “"” almost all the time, and you have to use it on every line.

On the other hand, the `"""` does form a much larger, more obvious continuation 
indicator. It is *extremely* obvious that the above line is not Swift code, but 
something else embedded in it. It's also extremely obvious what its extent is: 
when you stop seeing `"""`, you're back to normal Swift code.

I *really* don't like the idea of our only alternatives being "one double-quote 
mark with backslashing" or "use an entire heredoc". Heredocs have their place, 
but they are a *very* heavyweight quoting mechanism, and relatively short 
strings with many double-quotes are pretty common. (Consider, for instance, 
strings containing unparsed JSON.) I think we need *some* alternative to 
double-quotes, either single-quotes (with the same semantics, just as an 
alternative) or this kind of quote-stacking.

> For cases like this, I think it would be reasonable to have a “heredoc” like 
> scheme, which does not allow leading indentation, and does work with all the 
> same modifier characters above.  I do not have a preference on a particular 
> syntax, and haven’t given it any thought, but this would allow you to do 
> things like:
> 
>       let str = <<EOF
> <?xml version="1.0"?>
> <catalog>
> \t<book id="bk101" empty="">
> \t\t<author>\(author)</author>
> \t</book>
> </catalog>
> EOF
> 
> for example.  You could then turn off escaping and other knobs using the 
> modifier character (somehow, it would have to be incorporated into the syntax 
> of course).

There are two questions and a suggestion I have whenever heredoc syntax comes 
up.

Q1: Does the heredoc begin immediately, at the next line, or at the next valid 
place for a statement to start? Heredocs traditionally take the second approach.

Q2: Do you permit heredocs to stack—that is, for a single line to specify 
multiple heredocs?

S: During the Perl 6 redesign, they decided to use the delimiter's indentation 
to determine the base indentation for the heredoc:

        func x() -> String {
                return <<EOF
                <?xml version="1.0"?>
                <catalog>
                \t<book id="bk101" empty="">
                \t\t<author>\(author)</author>
                \t</book>
                </catalog>
                EOF
        }

Does that seem like a good approach?

> I generally agree with your down thread remarks about how Swift doesn’t like 
> to have multiple different solutions for the same problem.  OTOH, you could 
> look at “” syntax as being analogous to closure exprs, and heredoc syntax as 
> being analogous to nested functions :-)

Function declarations vs. closure variable assignments were actually the only 
example I could think of where Swift offers two hugely different ways to write 
the same thing. I ultimately decided that closure syntax is an inline shorthand 
for function syntax, and the fact that a declared function is kind of like a 
declared variable of function type is a red herring. :^)

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to