[swift-evolution] [Pitch] Improve String Literals

Xiaodi Wu xiaodi.wu at gmail.com
Fri May 12 16:14:00 CDT 2017


I feel like a broken record: Of the three proposed components of the
proposed solution, two were amply considered by the community and the core
team in SE-0168. The decision has already been made _not_ to implement
these ideas at this time.

Significant defects discovered after the fact during implementation or new
insights after extensive usage can prompt revisiting the decision, but that
is not the case here: implementation did not require further clarification
and the feature has only just landed on master. We simply cannot revisit
topics willy-nilly. The process simply cannot work that way: few have the
time and energy to offer their fullest consideration the first time round,
and no one would be willing to do that if it means that the same topic will
be revisited one month later.
On Fri, May 12, 2017 at 15:51 David Hart via swift-evolution <
swift-evolution at swift.org> wrote:

> Hi swift-evolution,
>
> Adrian Zubarev and I have discussed several issues with string literals
> still unresolved after the multi-line string literals proposals and we
> believe that they are important enough to address for Swift 4. Here is the
> pitch for our proposal.
>
> Please let us know what you think:
>
>
> https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md
>
> Improve String Literals
>
>    - Proposal: SE-XXXX
>    <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md>
>    - Authors: David Hart <https://github.com/hartbit>, Adrian Zubarev
>    <https://github.com/devandartist>
>    - Review Manager: TBD
>    - Status: TBD
>
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#introduction>
> Introduction
>
> This proposal builds on top the new features of SE-0168 Multi-Line String
> Literals
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/0168-multi-line-string-literals.md> by
> widening the use-cases for unescaped double-quotes and resolving certain
> issues around long lines in single and multi-line string literals.
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#motivation>
> Motivation
>
> In Swift 3, String literals have three pain points:
>
>    - Strings containing double-quotes
>    - Multi-line strings
>    - Long single-line strings
>
> Proposal SE-0168
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/0168-multi-line-string-literals.md> fixed
> the two first problems with the same syntax. Unfortunately, while an
> improvement on Swift 3, several problems remain:
>
>    - Long single-line strings still require the less than ideal
>    concatenation syntax:
>
> Some project styles (like the Standard Library) mandate a maximum line
> length, requiring long single-line strings to be hard-wrapped. This still
> requires odd solutions:
>
> assert(condition, "This is a long assertion message that requires " +
>     "string concatenation when the project style enforces maximum line " +
>     "lengths")
>
>
>    - Long lines in a multi-line strings can't be manually wrapped:
>
> let markdown = """    # Title    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer elementum commodo sem, a congue orci porta sit amet. Duis facilisis, est et vehicula congue, turpis dui ultricies nunc, ut elementum quam elit nec felis. Integer aliquam id risus nec laoreet. Vivamus vitae odio sit amet quam iaculis fermentum nec sed neque.    ## Subtitle    Cras et nibh velit. Praesent eleifend sagittis quam, pellentesque lobortis lectus commodo vel. Vivamus suscipit, nulla quis blandit ullamcorper, velit neque euismod nibh, nec blandit mi diam molestie ex. Cras porttitor, est sed pharetra interdum, ipsum mauris viverra quam, sit amet eleifend purus elit sit amet odio.    """
>
>
>    - Short strings containing double-quotes have to use the multi-line
>    syntax to benefit from unescaped double-quotes:
>
> print("""    { "success": false, "error": "Wrong parameter" }    """)
>
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#proposed-solution>Proposed
> solution
>
> By implementing multi-line string literals and support for unescaped
> double-quotes with the same syntax, SE-0168
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/0168-multi-line-string-literals.md> has
> made those features unusable on their own. By dissociating them and
> supporting two extra syntax features, we can solve all the above problems:
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#divorce-the--delimiter-from-the-multi-line-syntax-and-have-them-only-support-unescaped-double-quotes>Divorce
> the """ delimiter from the multi-line syntax and have them only support
> unescaped double-quotes
>
> The change allows us to express short strings containing double-quotes
> without resorting to the multi-line syntax:
>
> print("""{ "success": false, "error": "Wrong parameter" }""")
>
> As a consequence, multi-line strings are now only defined by a newline
> following the leading delimiter and the whitespace preceeding the trailing
> delimiter. They gain support for " delimiters, which has the nice
> advantage of saving a few characters in multi-line strings which are known
> to never contain double-quotes:
>
> print("""    Triple " are still valid delimiters
>     """)query("
>     SELECT 'name'
>     FROM 'people'
>     WHERE age > 20
>     ")
>
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#support-escaping-newlines-in-multi-line-strings-with-a-trailing->Support
> escaping newlines in multi-line strings with a trailing \
>
> This change allows hard-wrapping long lines in multi-line strings. They
> also have the added benefit of making trailing white-space at the end of
> source-code lines explicit.
>
> let markdown = """    # Title    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer \    elementum commodo sem, a congue orci porta sit amet. Duis facilisis, est \    et vehicula congue, turpis dui ultricies nunc, ut elementum quam elit nec \    felis. Integer aliquam id risus nec laoreet. Vivamus vitae odio sit amet \    quam iaculis fermentum nec sed neque.    ## Subtitle    Cras et nibh velit. Praesent eleifend sagittis quam, pellentesque \    lobortis lectus commodo vel. Vivamus suscipit, nulla quis blandit \    ullamcorper, velit neque euismod nibh, nec blandit mi diam molestie \    ex. Cras porttitor, est sed pharetra interdum, ipsum mauris viverra \    quam, sit amet eleifend purus elit sit amet odio.    """
>
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#adopt-the-cobjective-c-syntax-that-concatenates-single-line-strings>Adopt
> the C/Objective-C syntax that concatenates single-line strings
>
> This change will be familiar to C developers and provides a cleaner and
> more performant solution for long single-line strings:
>
> assert(condition, "This is a long assertion message that flows "
>     "from one line to the next without requiring the concatenation "
>     "operator")
> assert(condition, """This is another "single-line" message that """
>     """supports up to two double-quotes (" and "") without any """    """escaping""")
>
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#source-compatibility>Source
> compatibility
>
> This feature is purely additive; it has no effect on source compatibility.
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#effect-on-abi-stability>Effect
> on ABI stability
>
> This feature is purely additive; it has no effect on ABI stability.
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#effect-on-api-resilience>Effect
> on API resilience
>
> This feature is purely additive; it has no effect on API resilience.
>
> <https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md#alternatives-considered>Alternatives
> considered
>
> A different syntax for supporting long single-line strings was discussed
> where ending delimiters were replaced with the \escaping character,
> mirroring their use in multi-line strings:
>
> assert(condition, "This is a long assertion message that flows \    "from one line to the next without requiring the concatenation \
>     "operator")
> assert(condition, """This is another "single-line" message that \    """supports up to two double-quotes (" and "") without any \    """escaping""")
>
> That syntax saved two characters per line in strings with """ delimiters
> but had several disadvantages:
>
>    - It loses the familiarity with C syntax
>    - It introduces an asymmetry between the last line and those above
>    - It does not do any actual escaping, introducing developer ambiguity
>    with their use in multi-line literals
>
>
> _______________________________________________
> 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/20170512/2a3385da/attachment.html>


More information about the swift-evolution mailing list