[swift-evolution] multi-line string literals.
Ted F.A. van Gaalen
tedvgiosdev at gmail.com
Tue Apr 26 08:32:29 CDT 2016
Hi Michael
What happens if a delimiter in this case: “””
occurs embedded in the data? like so (two times here):
“””
dfksposdkj dslkd s hfdslk dskdslk lskd sk aaasd
lfsdlks dslksd sdlk sdlksd “”” fskfsdalkfsd “”” fdjf dkjfds
“”"
Having a particular token at the start of a line (or after leading space(s) ) to define a data line
allows us to use *all* available characters behind it.
Actually after further thinking, I assume that 1 token is not enough, perhaps there should be two tokens e.g.
\\ ……………... to process escaped chars, like \… and \(item),
the same way as with normal Swift string literals
\@…………. to take all characters as is without conversion?
Examples:
1.
let someText =
\\There are \t \t \(nrofboxes) boxes avai
\\lable.
converts to:
"There are 12 boxes available."
2.
let someText =
\@There are \t \t \(nrofboxes) boxes avai
\@able.
String taken as is, nothing is converted:
"There are \t \t \(nrofboxes) boxes available."
Of course one could choose other tokens than \\ and \@
they just looked convenient to me...
TedvG
> On 26.04.2016, at 07:53, Michael Peternell <michael.peternell at gmx.at> wrote:
>
> """Just in my opinion:
> having to start each line with a particular token kinda defeats the purpose of multiline string literals.
Why?
> "can't we just continue"
> "the literal on the next line anyways,"
> "like in C?"
> "or maybe the "+
> "at the end of the line can be"+
> "optimized away?"
> """
>
> What is wrong with just using """ as a delimiter? Except that maybe there are other languages which use this already. You can copy&paste whole XML snippets into such a thing. It's also good for usage instructions in a command line tool, and I think everyone will understand what it means. Is it a design goal to do something completely new? Or are you just unhappy with all existing multi-line string literal syntaxes?
>
> -Michael (who would be happy with Perl Heredoc-Syntax as well)
>
>> Am 26.04.2016 um 01:00 schrieb ted van gaalen via swift-evolution <swift-evolution at swift.org>:
>>
>> possible improvement, one could allow
>> leading spaces before the "data line token"
>> thus enabling indentation, like so
>> {
>> let str =
>> \\dataaaaaaaaaahgdfhhfdxfg cvcsffggcfg
>> \\c jggjvhfh fhffhfgxfxgdgfhgj jvhhfhfhcgxgc
>> .
>> .
>> }
>>
>> TedvG
>>
>> On 25 Apr 2016, at 20:47, Ted F.A. van Gaalen <tedvgiosdev at gmail.com> wrote:
>>
>>> This could be a simple solution:
>>>
>>> Starting each line with a special token.
>>>
>>> In the example here it is the \\ double-backslash .
>>> when the \\ appears in the first two columns of a source line,
>>> this tells the compiler that it is a data line and that more might follow.
>>> the last line starting with \\ completes the data entry.
>>>
>>> Here is an example of a string declaration with some XML
>>> (no escape sequences needed for “)
>>> Of course it could be anything other kind of textual data as well.
>>>
>>> let str =
>>> \\<!DOCTYPE html>
>>> \\<html>
>>> \\<body>
>>> \\
>>> \\<h1>W3Schools Internal Note</h1>\n
>>> \\<div>
>>> \\<b>To:</b> <span id="to"></span><br>\n
>>> \\<b>From:</b> <span id="from"></span><br>\n
>>> \\<b>Message:</b> <span id="message"></span>
>>> \\</div>
>>> \\\n
>>> \\<script>
>>> \\var txt, parser, xmlDoc;
>>> \\txt = "<note>" +
>>> \\"<to>Tove</to>" +
>>> \\etc. this is the last data line.
>>>
>>>
>>> Conditions:
>>>
>>> - Every line starting with \\ in first and second column of the line
>>> is treated as a data line.
>>> - All characters behind the \\ are regarded as data, thus note that:
>>> - the “ is not regarded as a string delimiter
>>> - the // chars and whatever follows it are interpreted as data on such a line, not as comment.
>>> - \\ within the data itself are treated as data e.g. this line is valid:
>>> \\There \\ are three backslashes (as data) in this line \\\\ today.
>>> \\
>>> the above data line is empty but is allowed.
>>>
>>> - Leading and embedded spaces are respected.
>>> - Tabs, Linefeeds etc. can be inserted the usual way using \t \n etc.
>>> - trailing spaces and line terminators cr lf are ignored, filtered out.
>>>
>>> let dutchNumbers =
>>> \\ een twee drie vier vijf
>>>
>>> \\ zes zeven acht negen tien
>>> \\these two data lines are orphans,
>>>
>>> Blank lines or other Swift statement lines in-between
>>> breaks a set of \\ data lines
>>>
>>>
>>> All \\ lines together are treated as one single string literal
>>> and may occur everywhere where “normal” string literals are allowed.
>>>
>>> // E.g. this if statement would be correct:
>>> // Yes, this would be legal but doesn’t look so great: Indentation not possible here
>>> if cars ==
>>> \\Ford
>>> \\ Delorean
>>> \\ Chevrolet
>>> {
>>> doSomething()
>>> }
>>>
>>> An array with 2 string elements:
>>>
>>> var ar =
>>> [
>>> \\sdkdslkdslkdsldkshfkjdljfsdljkfdshjklfd dioioioioio \n\nsljkf sdflkf dsl;dfsk sdlfk dfsfkds
>>> \\ sdkdfkdfldkfd fdfldk fdlkfd jkfds hjklfd dsljkf sdflkf dsl;dfsk sdlfk dfsfkds
>>> ,
>>> \\There are many ships in the ha
>>> \\rbour that are soon sailing away.
>>> ]
>>>
>>>
>>> I also thought about using “” as token, but this would be interpreted as an empty string.
>>> or “”” but this is an empty string followed by an unclosed string literal.
>>>
>>> Should be relatively easy to implement? What y’all think?
>>>
>>>
>>> Kind Regards
>>> TedvG
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
More information about the swift-evolution
mailing list