[swift-evolution] [Pitch] Parse expressions after 'as' and 'is' instead of just types

Matthew Johnson matthew at anandabits.com
Wed May 18 14:54:08 CDT 2016

> On May 16, 2016, at 4:06 PM, Joe Groff via swift-evolution <swift-evolution at swift.org> wrote:
> Currently, we parse a type after 'as[?!]' and 'is'. This is mostly what you'd expect, but does lead to problems when an 'as' expression appears as part of a comparison:
> 	20 as Int64 < y as Int64 // error, '>' expected to close generic parameter list Int64<y>
> Looking to the future, many people have also expressed interest in the ability to do dynamic type checks against metatype values, not only static types, as in:
> 	class Base {}
> 	class DerivedA {}
> 	class DerivedB {}
> 	var x: Base.Type = DerivedA
> 	DerivedA() as? x // succeeds
> 	DerivedB() as? x // fails

The dynamic check itself makes sense but it isn’t clear what type these expressions should return?  It can’t be `DerivedA?` like it would in the equivalent static expression as the type is not known statically:

DerivedA() as? DerivedA // succeeds with value Optional<DerivedA>.Some
DerivedB() as? DerivedA // fails with value Optional<DerivedA>.None

> If we accept https://github.com/apple/swift-evolution/blob/master/proposals/0090-remove-dot-self.md, dropping the '.self' requirement to refer to type objects, then I think we should also change 'is' and 'as' to parse the expression grammar on their right-hand side, leaving it up to the normal expression disambiguation rule to handle angle brackets. This solves the '20 as Int64 < x' problem, and prepares us to support dynamic is/as queries in the future. (To be clear, designing dynamic queries should be its own discussion.) What do you all think?
> -Joe
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

More information about the swift-evolution mailing list