[swift-evolution] Allowing non-binding pattern matching as a Bool expression?
Alex Lew
alexl.mail+swift at gmail.com
Wed Dec 9 00:29:56 CST 2015
Thanks, Chris, for all the time you're putting into responding to these
proposals (and the kindness with which you're responding!). I really like
that solution.
Brainstorming some names for the auto-generated functions:
1. If a case has no associated values, isX() -> Bool is generated, where X
is the case name.
If a case has an associated value of type T, asX() -> T? is generated,
where X is the case name.
This mirrors is/as? operators, which return Bool / Optional
respectively.
2. projectX() -> Bool / projectX() -> T?
3. isX() -> Bool / xValue() -> T?
Another option (probably the wrong option, but it's worth putting out
there) is that instead of returning Bool in the no-associated-value case,
we return ()?. This would make me feel better about using the same naming
convention (asX(), projectX(), xValue(), etc.) for each case, and would
allow for != nil checks on all cases. But it would probably be a little
confusing for newcomers to the language.
One (potentially misguided) question. I noticed in proposal 0002 (on
removing function currying) that there are "plans to move away from the
arguments-are-a-single-tuple model" in the near future. Would this also
affect associated values of enums? That is, might
case Dog(name: String, age: Int, breed: String)
one day not have the semantics of a single associated value of type (name:
String, age: Int, breed: String)? Or is the de-ML-ification planned only
for function arguments?
-Alex
On Wed, Dec 9, 2015 at 12:45 AM, Chris Lattner <clattner at apple.com> wrote:
>
> > On Dec 7, 2015, at 8:05 PM, Alex Lew via swift-evolution <
> swift-evolution at swift.org> wrote:
> >
> > Hi all,
> >
> > Curious to hear thoughts on allowing non-binding pattern matches to be
> used as boolean values outside of an if, guard, for...in, while, switch,
> etc. Something like:
> >
> > enum List<T> {
> > case Empty
> > indirect case Link(T, List<T>)
> >
> > func isEmpty() -> Bool {
> > return case .Empty = self
> > }
> > }
>
> I agree with you that this is a problem that we should solve, but I think
> it could be solved in a different way. Imagine if:
>
> enum Foo {
> case X(a : Float), Y, Z(a : Int)
> }
>
> automatically synthesized these members (the exact names are just a
> strawman proposal, not serious :-)
>
> extension Foo {
> func isX() -> Float? {…}
> func isY() -> Bool {…}
> func isZ() -> Int? {…}
> }
>
> This would tie into all of the mechanics we have for dealing with
> optionals, e.g. if/let and ??
>
> -Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151209/b93e9491/attachment.html>
More information about the swift-evolution
mailing list