[swift-evolution] multi-line string literals
Kametrixom Tikara
kametrixom at icloud.com
Fri Dec 11 17:28:25 CST 2015
Yeah I know it's not pleasant to write, but we don't actually want to write such string literals often, because it's actually just a hard coded string without any dynamic behaviour. Also the three back ticks is already a known syntax for most (GitHub) people.
> On 12 Dec 2015, at 00:21, Travis Tilley <ttilley at gmail.com> wrote:
>
> If you're writing a block of github flavored markdown, I can absolutely see someone wanting to write out 3 backticks in a multi-line string literal. ::shrug::
>
>
>
>> On Fri, Dec 11, 2015 at 6:08 PM, Kametrixom Tikara <kametrixom at icloud.com> wrote:
>> Why don't we just use the back ticks " ` ", making it similar to markup:
>>
>> let code =
>> ```
>> main = interact id
>> ```
>>
>> I believe nobody would ever want to put three back ticks inside a string.
>>
>> Also I think one doesn't actually want/need interpolation, because every char should be the same in the string as it appears in the code. We can do something like instead (just concat the strings together):
>>
>> let myString = "Hello!"
>> let code =
>> ```
>> main = p "``` + myString + ```"
>> where p = putStrLn
>> ```
>>
>> (Shorter would be to drop the "+" with some compiler magic, but that's meh)
>>
>> I don't think the use for such literals isn't too common so that it's not necessary to provide string interpolation just for these few cases.
>>
>>
>>> On 11 Dec 2015, at 18:29, Travis Tilley via swift-evolution <swift-evolution at swift.org> wrote:
>>>
>>> My updated thoughts, after some feedback about JSON and escaping, would be to wrap an escaped multi-line literal with triple quotes, and to wrap an unescaped multi-line literal with single quotes... Then, to make the overall syntax consistent, to do the same for single-line strings. In either case, quotes of any kind other than a triple quote would not need to be escaped in a multi-line string literal. So:
>>>
>>>
>>> let foo = """
>>> hell yeah, escapes! \n\n
>>> \(sound) like a "\(animal)"
>>> this is another completely random line
>>> """
>>>
>>> Would have a foo variable containing (note the stripped indentation, as that seems to be the popular request in this thread):
>>>> hell yeah, escapes!
>>>>
>>>> moo like a "cow"
>>>> this is another completely random line
>>>
>>> But if wrapped by ''' then none of the interpolation or escape processing happens (and quotes still don't need to be escaped).
>>>
>>> Come to think of it, I don't see why a ''' syntax would -have- to be multi-line. No reason why '''/"moo"/"cow"/g''' should be invalid from a technical perspective. (note that swift has no native regex literal, though you can create your own and this triple single-quote syntax might make that less painful)
>>>
>>>
>>> - Travis Tilley
>>>
>>>
>>>> On Fri, Dec 11, 2015 at 12:01 PM, John Siracusa via swift-evolution <swift-evolution at swift.org> wrote:
>>>> Sorry about the lack of a subject on this message originally. I was replying to the email digest and forgot to add one. It should be part of the "multi-line string literals" thread.
>>>>
>>>> -John
>>>>
>>>>> On Fri, Dec 11, 2015 at 11:52 AM, John Siracusa <siracusa at gmail.com> wrote:
>>>>>
>>>>> Chris Lattner wrote:
>>>>>> When introducing a feature like this, I think it would be useful to survey a range of popular languages (and yes, even perl ;-) to understand what facilities they provide and why (i.e. what problems they are solving) and synthesize a good swift design that can solve the same problems with a hopefully simple approach.
>>>>>
>>>>> Travis Tilley wrote:
>>>>>> Perl and Erlang are unique in that valid code in either language looks essentially like line noise. I'd rather take inspiration from languages like ruby, python, and elixir.
>>>>>
>>>>> Jokes aside, the ability to choose delimiters for strings and other language constructs that surround some value is a huge boon to code readability.
>>>>>
>>>>> For example, RegExp literals in JavaScript:
>>>>>
>>>>> var regex = /^\/usr\/local\//; // gross
>>>>>
>>>>> An even simpler example, which applies to many languages: a string literal that contains all of your possible string delimiters within it. This is not an exotic thing in English.
>>>>>
>>>>> message = "\"I don't like this,\" she said."; // nope
>>>>> message = '"I don\'t like this," she said.'; // still nope
>>>>>
>>>>> Then, of course, there's your escape character itself:
>>>>>
>>>>> escapes = "Some escapes: \\n, \\t, \\a"; // sigh
>>>>>
>>>>> There are many time-tested solutions to these syntactic/cosmetic problems.
>>>>>
>>>>> * Different delimiters with different interpolation rules (e.g., single quotes not honoring any backslash escapes and not doing variable interpolation)
>>>>>
>>>>> * Matched-pair delimiters that don't require anything to be escaped as long as the delimiters are absent or matched within the string. (These alone solve a huge range of problems.)
>>>>>
>>>>> * Heredocs for long literals where you get to pick the end token.
>>>>>
>>>>> * Heredocs modified by delimiters around the end token to control interpolation within the long literal.
>>>>>
>>>>> Which language looks like line noise now?
>>>>>
>>>>> $messasge = q("I can't believe how nice this is," she said (quietly).);
>>>>>
>>>>> $regex = qr(^/usr/local/);
>>>>>
>>>>> $escapes = 'Some escapes: \n, \t, \a';
>>>>>
>>>>> My take: once you use a language where you pretty much never have to backslash-escape a character you can easily type to get it into a string, it's really hard to go back.
>>>>>
>>>>> -John
>>>>
>>>>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>
>>>
>>> _______________________________________________
>>> 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/20151212/0a84536c/attachment.html>
More information about the swift-evolution
mailing list