The hidden bugs arise when, instead of pill, you invoke pill(), and the
return value of pill() changes from Bool to Bool? or vice versa between one
version of a library and another.

Point is, a second keyword is needed precisely because unwrapping should
never be implicit. That much has been made clear in previous conversations
where "guard let x" has been repeatedly rejected as a sugar for "guard let
x = x". It stands to reason that "guard x" is even less acceptable.

On Mon, Oct 31, 2016 at 14:43 Kenny Leung via swift-evolution <
swift-evolution@swift.org> wrote:

> Now that I think about it some more, I think my proposal does not hurt the
> guard boolean case, and is still backward compatible.
>
> Current Universe:
>
> // This is the case Xiaodi mentions
> var pill :Boolean
> guard pill else {}
>
> // If pill was an optional-boolean, you would have to write it this way:
> var pill :Boolean?
> guard let pill = pill, pill else {}
>
> Kenny’s Universe:
>
> // This is the case Xiaodi mentions - nothing changes
> var pill :Boolean
> guard pill else{}
>
> // If pill was an optional-boolean, you might write this, but it only
> checks if pill is nil or not, and NOT true or false. This would be illegal
> in the Current Universe, so we know there is no backward incompatibility or
> hidden bugs.
> var pill :Boolean?
> guard pill else {}
>
> -Kenny
>
>
> > On Oct 31, 2016, at 12:33 PM, Kenny Leung via swift-evolution <
> swift-evolution@swift.org> wrote:
> >
> > I use guard pretty much exclusively in the “guard let x = x” context. I
> still think it’s a bad idea to sacrifice the 99% case for the 1% case.
> >
> > -Kenny
> >
> >
> >> On Oct 31, 2016, at 12:16 PM, Xiaodi Wu via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>
> >> Well, "guard x != nil" does not unwrap x. An additive proposal must
> make clear the difference between testing if an optional is nil and
> unwrapping it.
> >>
> >> Meanwhile, "guard foo" tests if foo evaluates to true. An additive
> proposal cannot break this syntax.
> >> On Mon, Oct 31, 2016 at 14:11 Charlie Monroe <char...@charliemonroe.net>
> wrote:
> >> To me, it makes more sense to use
> >>
> >> guard nonnil x else ...
> >>
> >> since guard is guarding a condition is true - or am I wrong? Generally,
> it would tell the compiler that
> >>
> >> guard x != nil else ...
> >>
> >> which to me reads like guard nonnil x...
> >>
> >> Just a side-note...
> >>
> >>> On Oct 31, 2016, at 8:05 PM, Xiaodi Wu via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>>
> >>> The proposal is to create a new shorthand "guard unwrap x" for "guard
> let x = x". The "guard" statement serves purposes other than unwrapping
> variables and cannot be removed.
> >>> On Mon, Oct 31, 2016 at 14:03 Joshua Alvarado <
> alvaradojosh...@gmail.com> wrote:
> >>> Without going back through the history, is the proposal to keep
> replace guard or still keep guard keyword and create a new unwrap? If
> unwrap is added the guard keyword should just be removed.
> >>>
> >>> Alvarado, Joshua
> >>>
> >>> On Oct 31, 2016, at 12:49 PM, Xiaodi Wu via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>>
> >>>> Because "guard" already means something...
> >>>>
> >>>>
> >>>> On Mon, Oct 31, 2016 at 13:45 Kenny Leung via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>>> It seems to me that you would end up typing “guard unwrap” 99% of the
> time, so why not just let “guard” imply “guard unwrap” 100% of the time?
> >>>>
> >>>> -Kenny
> >>>>
> >>>>
> >>>>> On Oct 31, 2016, at 11:34 AM, Erica Sadun <er...@ericasadun.com>
> wrote:
> >>>>>
> >>>>> Because there's an action taking place in addition to guarding
> >>>>>
> >>>>> -- E
> >>>>>
> >>>>>> On Oct 31, 2016, at 12:30 PM, Kenny Leung via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>>>>>
> >>>>>> Why have the “unwrap” keyword at all? Isn’t “guard” the keyword?
> >>>>>>
> >>>>>> guard blah else {
> >>>>>> }
> >>>>>>
> >>>>>> -Kenny
> >>>>>>
> >>>>>>
> >>>>>>> On Oct 28, 2016, at 3:34 PM, Erica Sadun via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>>> On Oct 26, 2016, at 11:39 AM, Chris Lattner via swift-evolution <
> swift-evolution@swift.org> wrote:
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>> On Oct 26, 2016, at 10:23 AM, Joshua Alvarado <
> alvaradojosh...@gmail.com> wrote:
> >>>>>>>>>
> >>>>>>>>> In your example the keyword only makes sense if you are
> shadowing the optional variable. How would unwrap work with a different
> name?
> >>>>>>>>
> >>>>>>>> It wouldn’t: “unwrap” would never include an equal sign.  If you
> want to do that, use a standard "if let”.
> >>>>>>>>
> >>>>>>>> -Chris
> >>>>>>>
> >>>>>>> So I can stop thinking about this. Gist is here:
> https://gist.github.com/erica/db9ce92b3d23cb20799460f603c0ae7c
> >>>>>>>
> >>>>>>> -- E
> >>>>>>>
> >>>>>>>
> >>>>>>> Introducing unwrap
> >>>>>>>
> >>>>>>>    • Proposal: TBD
> >>>>>>>    • Author: Erica Sadun, Chris Lattner, David Goodine
> >>>>>>>    • Status: TBD
> >>>>>>>    • Review manager: TBD
> >>>>>>> Introduction
> >>>>>>>
> >>>>>>> This proposal introduces unwrap, simplifying common shadowing and
> allowing a unified syntax for one-item associated values such as Result
> types.
> >>>>>>>
> >>>>>>> Swift-evolution thread: guard let x = x
> >>>>>>>
> >>>>>>> Motivation
> >>>>>>>
> >>>>>>> Swift lacks a unified, safe way to bind an optional or
> single-value enumeration to a shadowed varaiable that is guaranteed to be
> the same name. Introducing unwrap ensures the conditionally bound item does
> not accidentally shadow any other item.
> >>>>>>>
> >>>>>>> Compare:
> >>>>>>>
> >>>>>>> guard let foobar = foobar else { …
> >>>>>>> }
> >>>>>>>
> >>>>>>> guard unwrap foobar else { … }
> >>>>>>> Using unwrap eliminates repetition ("foobar = foobar" fails DRY
> principles) and retains clarity. The keyword is common, simple to
> understand, and easy to search for if Swift users are unfamiliar with it.
> >>>>>>>
> >>>>>>> This syntax simplifies one-item associated value enumerations by
> offering a common syntax. Compare:
> >>>>>>>
> >>>>>>> enum Result<T> { case success(T), error(Error
> >>>>>>> ) }
> >>>>>>>
> >>>>>>>
> >>>>>>> guard case let .success(value) = result else { ...
> >>>>>>> }
> >>>>>>>
> >>>>>>> guard unwrap result else { ... }
> >>>>>>> In the latter case result is bound to the wrapped value. Again, it
> is simpler and clearer, even with non-Optional types.
> >>>>>>>
> >>>>>>> Detailed Design
> >>>>>>>
> >>>>>>> unwrap can be used with any one-value enumeration. The unwrapped
> value is bound to the same symbol as the associated type.
> >>>>>>>
> >>>>>>> enum TypeName<T, U> { case anycase(T), anothercase(U) }
> >>>>>>>
> >>>>>>> // First and second are type `TypeName`
> >>>>>>> let first = TypeName.anyCase(value1)
> >>>>>>> let second = TypeName. anothercase(value2)
> >>>>>>>
> >>>>>>> guard unwrap first else { ... }
> >>>>>>> // first is now shadowed as type T
> >>>>>>>
> >>>>>>> guard unwrap second else { ... }
> >>>>>>> // second is now shadowed as type U
> >>>>>>>
> >>>>>>> Impact on Existing Code
> >>>>>>>
> >>>>>>> This change is additive and has no impact on existing code other
> than intentional refactoring.
> >>>>>>>
> >>>>>>> Timeline
> >>>>>>>
> >>>>>>> This proposal is additive and not suited for consideration until
> Swift 4 phase 2
> >>>>>>>
> >>>>>>> Alternatives Considered
> >>>>>>>
> >>>>>>>    • Using a bind keyword. Past discussions were held in the first
> week of February 2016.
> >>>>>>>    • Fixing pattern matching grammar
> >>>>>>>    • Not using this approach
> >>>>>>>
> >>>>>>> _______________________________________________
> >>>>>>> swift-evolution mailing list
> >>>>>>> swift-evolution@swift.org
> >>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> >>>>>>
> >>>>>> _______________________________________________
> >>>>>> swift-evolution mailing list
> >>>>>> swift-evolution@swift.org
> >>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> >>>>>
> >>>>
> >>>> _______________________________________________
> >>>> swift-evolution mailing list
> >>>> swift-evolution@swift.org
> >>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> >>>> _______________________________________________
> >>>> swift-evolution mailing list
> >>>> swift-evolution@swift.org
> >>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> >>> _______________________________________________
> >>> swift-evolution mailing list
> >>> swift-evolution@swift.org
> >>> https://lists.swift.org/mailman/listinfo/swift-evolution
> >>
> >> _______________________________________________
> >> swift-evolution mailing list
> >> swift-evolution@swift.org
> >> https://lists.swift.org/mailman/listinfo/swift-evolution
> >
> > _______________________________________________
> > swift-evolution mailing list
> > swift-evolution@swift.org
> > https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to