> On Apr 12, 2017, at 5:39 PM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> On Wed, Apr 12, 2017 at 5:20 PM, Brent Royal-Gordon <br...@architechies.com 
> <mailto:br...@architechies.com>> wrote:
> Wow, maybe I shouldn't have slept.
> 
> Okay, let's deal with trailing newline first. I'm *very* confident that 
> trailing newlines should be kept by default. This opinion comes from lots of 
> practical experience with multiline string features in other languages. In 
> practice, if you're generating files in a line-oriented way, you're usually 
> generating them a line at a time. It's pretty rare that you want to generate 
> half a line and then add more to it in another statement; it's more likely 
> you'll interpolate the data. I'm not saying it doesn't happen, of course, but 
> it happens a lot less often than you would think just sitting by the fire, 
> drinking whiskey and musing over strings.
> 
> I know that, if you're pushing for this feature, it's not satisfying to have 
> the answer be "trust me, it's not what you want". But trust me, it's not what 
> you want.
> 
> This is not a very good argument. If you are generating files in a 
> line-oriented way, it is the function _emitting_ the string that handles the 
> line-orientedness, not the string itself. That is the example set by 
> `print()`:
> 
> ```
> print("Hello, world!") // Emits "Hello, world!\n"
> ```

You say "this is the example set by `print`", but I don't think anything else 
actually *follows* that example. No other I/O operation in Swift behaves this 
way. The underlying `TextOutputStream.write(_:)` doesn't; the I/O in Foundation 
doesn't; file descriptor I/O doesn't. Concatenation certainly doesn't; nor does 
anything else you might do to assemble several multiline string literals into a 
whole. So I think `print()` is the exception here, not the rule.

In my opinion, modulo the "newline after leading delimiter" question, if code 
like this example:

        var xml = """
            <?xml version="1.0"?>
            <catalog>
            """
        
        for (id, author, title, genre, price) in bookTuples {
            xml += """
                    <book id="bk\(id)">
                        <author>\(author)</author>
                        <title>\(title)</title>
                        <genre>\(genre)</genre>
                        <price>\(price)</price>
                    </book>
                """
        }
        
        xml += """
            </catalog>
            """

Doesn't assemble the kind of string that it's blatantly obvious the user is 
trying to assemble, I think the syntax has failed.

`print()` is the outlier. It's an important enough outlier that we should 
probably help the user notice when they're about to get it wrong, but an 
outlier it is.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to