> On Mar 14, 2016, at 11:05 PM, Brent Royal-Gordon <[email protected]> 
> wrote:
> 
>> On Mar 10, 2016, at 9:19 AM, Joe Groff via swift-evolution 
>> <[email protected]> wrote:
>> 
>> For (A), we should look at the new places a generic type might appear in 
>> expressions:
>> 
>> - By itself:
>> 
>> let x = Foo< T >
>> bar() // following statement
>> 
>> let y = Foo< T, U >
>> bar() // following statement
>> 
>> This doesn't strike me as a huge problem to parse as a type reference, since 
>> 'a < b > c' is unlikely as an expression, and we don't have commas in the 
>> top level of the grammar, so 'a < b, c > d' is impossible as a top-level 
>> expression. Extending the lookahead rule to include `>;` or `> *token on 
>> next line*` as disambiguators is probably OK.
>> 
>> - As a function parameter, or array or dictionary element:
>> 
>> sizeof(Foo<T>)
>> load(Foo<T>, atOffset: 8)
>> let types = [Foo<T>, Bar<U>]
>> let factories = [Foo<T>: makeFoo, Bar<U>: makeBar]
>> 
>> This is probably the most common use case for type references, and the 
>> easiest to support, since the parameters are always followed by a token that 
>> can't start an expression by itself. We could extend the current lookahead 
>> rule to ensure it includes `>)`, `>,` and `>:`.
>> 
>> - As the parameter to an operator:
>> 
>> ++Foo<T> // prefix
>> Foo<T>++ // postfix
>> Foo<T>+Bar<U> // infix
>> Foo<T> + Bar<U>
>> let foo = Bar<U>
>> 
>> This one's a bit interesting since `>+` or `>++` could be operators 
>> themselves. Applying operators to types might not be a compelling enough 
>> reason to block the other changes, though.
> 
> Well, comparison `>` is an infix operator. Could we treat generic parameter 
> list `>` as a postfix operator? That is, require whitespace (or at least 
> something that is neither operator nor identifier, like a parenthesis or dot) 
> to its right but not its left? That would require looking all the way through 
> the generic parameter list to the end, but we could bail early if we 
> encounter something that can't be in a generic parameter list (as far as I 
> can tell, that includes identifiers and dots, angle brackets and commas, and 
> characters used in type shorthand).

Possibly. However, treating `>` as a postfix operator would conflict with the 
current standard library formatting conventions, which prefer to split long 
generic parameter lists K&R-style like this:

func foo<
  T where...
>(
  args...
) {
  code...
}

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

Reply via email to