> On Mar 10, 2017, at 9:49 AM, Joe Groff via swift-evolution 
> <[email protected]> wrote:
> 
> Having ExpressibleByStringInterpolation refine ExpressibleByStringLiteral 
> makes sense. I think there's a more powerful alternative design you should 
> also consider. If the protocol looked like this:
> 
> protocol ExpressibleByStringInterpolation: ExpressibleByStringLiteral {
>   associatedtype LiteralSegment: ExpressibleByStringLiteral
>   associatedtype InterpolatedSegment
>   init(forStringInterpolation: Void)
> 
>   mutating func append(literalSegment: LiteralSegment)
>   mutating func append(interpolatedSegment: InterpolatedSegment)
> }
> 
> Then an interpolation expression like this in `Thingy` type context:
> 
> "foo \(bar) bas \(zim: 1, zang: 2)\n"
> 
> could desugar to something like:
> 
> {
>   var x = Thingy(forStringInterpolation: ())
>   // Literal segments get appended using append(literalSegment: "literal")
>   x.append(literalSegment: "foo ")
>   // \(...) segments are arguments to a InterpolatedSegment constructor
>   x.append(interpolatedSegment: Thingy.InterpolatedSegment(bar))
>   x.append(literalSegment: " bas ")
>   x.append(interpolatedSegment: Thingy.InterpolatedSegment(zim: 1, zang: 2))
> 
>   return x
> }()
> 
> This design should be more efficient, since there's no temporary array of 
> segments that needs to be formed for a variadic argument, you don't need to 
> homogenize everything to Self type up front, and the string can be built up 
> in-place. It also provides means to address problems 3 and 4, since the 
> InterpolatedSegment associated type can control what types it's initializable 
> from, and can provide initializers with additional arguments for formatting 
> or other purposes.

Hi Joe,

The trade-offs for this approach would be:
- each append would need to return a valid object w.r.t the type’s invariants.
- an implementation could use the init(stringInterpolation:) could be a final 
building step, while append would not indicate that the object construction was 
complete. 

One example where this could be a problem would be if someone used the segments 
to build up a localized representation of the interpolated string.

-DW

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to