[swift-evolution] multi-line string literals.

Ricardo Parada rparada at mac.com
Tue May 10 17:32:19 CDT 2016


These are my comments so far.

Regarding the use of _” and “_ : It works but I think the _ already has a meaning elsewhere and may bring just a little bit of confusion at first.  But more than that, I’m not sure I like the way it looks aesthetically.  I can’t quite explain it.  It is one character shorter than the triple quote, i.e. “””.  However, I wonder if other alternatives could work out better.  For example, here’s a couple:

let xml = @"<?xml version="1.0"?>
        <catalog>
           <book id="bk101" empty="">
               <author>\(author)</author>
               <title>XML Developer's Guide</title>
               <genre>Computer</genre>
               <price>44.95</price>
               <publish_date>2000-10-01</publish_date>
               <description>An in-depth look at creating applications with XML.</description>
           </book>
        </catalog>"@

and with optional continuation quote it would look like this:

let xml = @"<?xml version="1.0"?>
           "<catalog>
           “   <book id="bk101" empty="">
           "      <author>\(author)</author>
           "      <title>XML Developer's Guide</title>
           "      <genre>Computer</genre>
           "      <price>44.95</price>
           "      <publish_date>2000-10-01</publish_date>
           "      <description>An in-depth look at creating applications with XML.</description>
           “   </book>
           "</catalog>"@

Regarding the HEREDOC notation, all I can say is that it looks heavier.  It may be more flexible, but if @“”@ looks better (in my eyes) why would we want another alternative.  I would prefer to keep the one that looks better and simpler.


> On May 10, 2016, at 2:53 AM, John Holdsworth via swift-evolution <swift-evolution at swift.org> wrote:
> 
> I’ve assembled a gist to summarise the main proposals of this thread.
> 
> https://gist.github.com/johnno1962/5c325a16838ad3c73e0f109a514298bf <https://gist.github.com/johnno1962/5c325a16838ad3c73e0f109a514298bf>
> 
> At the moment there seem to be four proposals for multi-line strings:
> 
> 1) Bent’s proposal for continuation quotes where if a conventional string
> does not close, if the first non-whitespace character of the next line is “
> (or perhaps |) the string is continued. This gives you precise control
> over exactly what is in the string.
> 
> 2) Tyler's original proposal involving strings that can contain newlines
> delimited “””like this“”” as they are in python or, _”like this“_. This works
> well in external editors and on github. Indentation is catered for by stripping 
> any whitespace before the closing quote from all lines in the string.
> 
> 3) HEREDOC syntax <<“TAG” or <<‘TAG’ taken from languages like Perl 
> subject to the same indentation removal rules as “””strings””” above. This
> has the advantage that the literal is clearly separated from your code.
> 
> 4) Heck it all, why not all three syntaxes or some combination.
> 
> (There is a separate feature that all string literals can be prefixed by
> e as in e”\w\d+” to turn of all escape processing for another day)
> 
> While the Swift Lexer could easily accommodate all these syntaxes there was
> talk early on that Swift has more of a "one way, maximally elegant” ethos and 
> indeed I find it difficult imagine the Swift Book breathlessly describing all three
> formats so I’m wondering if push came to shove which format people would chose?
> 
> My vote having undergone a "road to damascus" moment now we know it is
> available sooner rather than later is.. HEREDOC! It’s well understood and
> while at first it would seem to not be a good fit for Swift produces clear code.
> 
> Votes?
> 
> John
> 
> 
>         // Multi-line string proposals
>         // https://github.com/apple/swift/pull/2275 <https://github.com/apple/swift/pull/2275>
> 
>         // swift-evolution thread:
>         // http://thread.gmane.org/gmane.comp.lang.swift.evolution/904/focus=15133 <http://thread.gmane.org/gmane.comp.lang.swift.evolution/904/focus=15133>
> 
>         // These examples should load in the prototype toolchain available here:
>         // http://johnholdsworth.com/swift-LOCAL-2016-05-09-a-osx.tar.gz <http://johnholdsworth.com/swift-LOCAL-2016-05-09-a-osx.tar.gz>
> 
>         // The prototype currently parses three new forms of quoting
>         // These new types are still string literals for the grammar.
> 
>         "the existing string literal format"
>         _"a format that does not require you to escape " characters"_ // possibly redundant
>         """a python-style syntax that will accept "'s and newlines in the string"""
>         <<"HEREDOC"
>         A full heredoc implementation (will always end in a newline)
>         HEREDOC
> 
>         // These strings can be modified by prefixing the string by letters
>         // There is currently only one, "e" to disable escape processing.
>         // This is primarily used when specifying regular expressions.
> 
>         let str = "print(\"Hello, world!\\n\")"
> 
>         assert( e"print(\"Hello, world!\n\")" == str )
>         assert( e_"print("Hello, world!\n")"_ == str )
>         assert( e"""print("Hello, world!\n")""" == str )
> 
>         // Continuation quotes allow you to extend a standard string literal
>         // over multiple lines. If a string does not close on a line and the
>         // first non-whitespace character on the next line is " that line
>         // will be a contination of the string including the newline character
>         // (unless it is escaped). Interpolation and escapes process as before
>         // unless the first segment of the string is modified by the "e" prefix.
> 
>         // The advantage of this format allows you to indent while giving
>         // you precise control of exactly what is going into the literal.
> 
>         let author = "Gambardella, Matthew"
> 
>         let xml = "<?xml version=\"1.0\"?>
>             "<catalog>
>             "   <book id=\"bk101\" empty=\"\">
>             "       <author>\(author)</author>
>             "       <title>XML Developer's Guide</title>
>             "       <genre>Computer</genre>
>             "       <price>44.95</price>
>             "       <publish_date>2000-10-01</publish_date>
>             "       <description>An in-depth look at creating applications with XML.</description>
>             "   </book>
>             "</catalog>
>             ""
>         print(xml)
> 
>         // Perhaps, to avoid the zera crossing effect in text editors due to
>         // the unbalanced quotes, the continuation character could be "|".
>         // (newlines escaped with \ and blank lines are discarded.)
> 
>         assert( xml == "\
>             |<?xml version=\"1.0\"?>
>             |<catalog>
>             |   <book id=\"bk101\" empty=\"\">
>             |       <author>\(author)</author>
>             |       <title>XML Developer's Guide</title>
>             |       <genre>Computer</genre>
>             |       <price>44.95</price>
>             |       <publish_date>2000-10-01</publish_date>
>             |       <description>An in-depth look at creating \
>                             |applications with XML.</description>
> 
>             |   </book>
>             |</catalog>
>             |" )
> 
> 
>         // _""_ quoted strings also suppport these behaviours but don't require
>         // escaping of embedded " characters. Think of them as a being modifier
>         // on conventional string literals. They support continuation quotes.
> 
>         assert( xml == _"<?xml version="1.0"?>
>             "<catalog>
>             "   <book id="bk101" empty="">
>             "       <author>\(author)</author>
>             "       <title>XML Developer's Guide</title>
>             "       <genre>Computer</genre>
>             "       <price>44.95</price>
>             "       <publish_date>2000-10-01</publish_date>
>             "       <description>An in-depth look at creating applications with XML.</description>
>             "   </book>
>             "</catalog>\n"_ )
> 
>         // _"strings"_ could allow newlines and replace """strings""" discussed next
> 
>         assert( xml == _"<?xml version="1.0"?>
>             <catalog>
>                <book id="bk101" empty="">
>                    <author>\(author)</author>
>                    <title>XML Developer's Guide</title>
>                    <genre>Computer</genre>
>                    <price>44.95</price>
>                    <publish_date>2000-10-01</publish_date>
>                    <description>An in-depth look at creating applications with XML.</description>
>                </book>
>             </catalog>
>             "_ )
> 
>         // The triple quoted strings can contain newlines and, unless modified by "e"
>         // will process interpolations and not require escaping of ". To allow indenting,
>         // any whitespace characters that preceed the closing """ will be removed from 
>         // each line of the final literal. A warning is shown if lines do not contain
>         // the exact same indentation characters. Any intial linefeed is also removed.
> 
>         // The advantage of this format is the """ introducer works well when syntax
>         // highlighting in external editors and github as quotes are always balanced.
> 
>         assert( xml == """
>             <?xml version="1.0"?>
>             <catalog>
>                <book id="bk101" empty="">
>                    <author>\(author)</author>
>                    <title>XML Developer's Guide</title>
>                    <genre>Computer</genre>
>                    <price>44.95</price>
>                    <publish_date>2000-10-01</publish_date>
>                    <description>An in-depth look at creating applications with XML.</description>
>                </book>
>             </catalog>
>             """ )
> 
>         assert( xml != e"""<?xml version="1.0"?>
>             <catalog>
>                <book id="bk101" empty="">
>                    <author>\(author)</author>
>                    <title>XML Developer's Guide</title>
>                    <genre>Computer</genre>
>                    <price>44.95</price>
>                    <publish_date>2000-10-01</publish_date>
>                    <description>An in-depth look at creating applications with XML.</description>
>                </book>
>             </catalog>
>             """ )
> 
>         // heredoc syntax comes in two variants <<"TAG" and <<'TAG' (non-escaping, "e" prefix)
>         // It applies the same indentation removal rules as does """. This change has wider
>         // ramifications for the toolchain as compiler tokens are no longer in file order
>         // and will take a while for a few problems to be ironed out. The more consistent
>         // <<e"TAG" is a rather clumsy alternative to <<'TAG' for non-escaping strings.
> 
>         // HEREDOC's advantage is that the literal no longer interrupts the flow of your code.
> 
>         assert( (<<"XML" + <<"XML") == xml + xml )
>         <?xml version="1.0"?>
>         <catalog>
>            <book id="bk101" empty="">
>                <author>\(author)</author>
>                <title>XML Developer's Guide</title>
>                <genre>Computer</genre>
>                <price>44.95</price>
>                <publish_date>2000-10-01</publish_date>
>                <description>An in-depth look at creating applications with XML.</description>
>            </book>
>         </catalog>
>         XML
>         <?xml version="1.0"?>
>         <catalog>
>            <book id="bk101" empty="">
>                <author>\(author)</author>
>                <title>XML Developer's Guide</title>
>                <genre>Computer</genre>
>                <price>44.95</price>
>                <publish_date>2000-10-01</publish_date>
>                <description>An in-depth look at creating applications with XML.</description>
>            </book>
>         </catalog>
>         XML
> 
>         // For text you do not want to contain newlines, escape them using \
> 
>         print( <<"LOREM" )
>         Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt \
>         ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco \
>         laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in \
>         voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat \
>         non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\
>         LOREM
> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160510/b3f888d4/attachment-0001.html>


More information about the swift-evolution mailing list