[swift-evolution] The bind thread

Andrew Bennett cacoyi at gmail.com
Mon Feb 1 16:36:58 CST 2016


I'm -1 as stated, I don't think the proposed change adds any clarity, if
anything it adds more things to learn.

I think you can achieve some of your goals with a linter. You need to
consider how this works with pattern matching. It would remove the ability
to mutate the value type in a switch without a reassignment.

I'm closer to liking it if it removes nothing from the language and adds
something like this:

var x: Int?
let y: Int?
if bind x, y where x == y {
    x = 4 // changes the x outside this scope
    y = 5 // compile time error
    x = nil // compile time error
}

I think that makes bind make more sense, and less surprising. However it
doesn't clarify anything about it no longer being optional.

It would be nice if the following worked, although I it has its own issues
with surprises:

let x: Int? = 123
if x != nil {
   ... // x is non-optional here
}
assert(x != nil)
// x is non-optional here

var y: Int? = 456
while y != nil {
    // y is non-optional here
}
// y is optional here

On Tuesday, 2 February 2016, T.J. Usiyan via swift-evolution <
swift-evolution at swift.org> wrote:

> I don't think that the keyword is silly but this is a good point. I forgot
> that this application of the `?` postfix exists.
>
> On Mon, Feb 1, 2016 at 2:56 PM, Tyler Cloutier via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>> The bind or exists keywords seem sort of silly to me. There is already
>> syntax for binding optionals:
>>
>> if x? {
>> foo(x) // x type narrowed after binding.
>> }
>>
>> Tyler
>>
>>
>> On Feb 1, 2016, at 11:35 AM, Howard Lovatt via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>> I like this proposal. I also think that either bind or exists could be
>> the keyword. I would suggest that both forms of syntax should be allowed,
>> e.g.:
>>
>>     if bind x { /* x is non-nil, unwrapped, and hides original x inside
>> if statement */ }
>>     if bind x = object.property { /* x is non-nil and unwrapped */ }
>>
>> On Tuesday, 2 February 2016, Dave via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>>> I *think* it’d be _
>>>
>>> You could use it to test if the return value is non-nil, but you’d have
>>> to revert to “if let x = …” to actually use the results.
>>>
>>> I think.
>>>
>>> - Dave Sweeris
>>>
>>> On Feb 1, 2016, at 11:22, T.J. Usiyan via swift-evolution <
>>> swift-evolution at swift.org> wrote:
>>>
>>> This is interesting. What name is created by
>>>
>>>   if bind foo.somethingReturningAnOptional {
>>>       // ???
>>>   }
>>>
>>> On Mon, Feb 1, 2016 at 2:18 PM, Erica Sadun via swift-evolution <
>>> swift-evolution at swift.org> wrote:
>>>
>>>> Joe says "If you all are serious about this, I think you should start
>>>> a new thread about it."
>>>> I think it's worth a serious discussion just so it can be evaluated and
>>>> either adopted or discarded
>>>> and dropped forever. Here goes.
>>>>
>>>> INTRO
>>>>
>>>> The if let x = x {...} and guard let x = x else {...} constructs do
>>>> something with let (and var) that's
>>>> fundamentally different from let (and var) elsewhere in the language.
>>>> The same keywords are used to conditionally unwrap
>>>> and bind an item, not just shadow that item's current value.
>>>>
>>>> Introducing a new bind keyword to indicate unwrapping and binding
>>>> would disambiguate these uses.
>>>>
>>>> DETAIL DESIGN:
>>>>
>>>> Jacob Bandes-Storch offers two common use-cases. I prefer his "if bind
>>>> foo" to my original "if bind foo = foo":
>>>>
>>>>   if bind foo {
>>>>       // foo is non-optional in here
>>>>   }
>>>>
>>>>   somethingAsync { [weak self] in
>>>>       guard bind self else { return }
>>>>       // ...
>>>>   }
>>>>
>>>> JBS's approach offers my original "bind" keyword to unwrap and shadow
>>>> bind, but also provides a way to
>>>> strongly bind a weak reference to self, which (presumably) would allow
>>>> self semantics in the remaining
>>>> lifetime of that scope.
>>>>
>>>> ALTERNATIVE PROPOSALS:
>>>>
>>>> Tino Heth proposes a second use-case one with different semantics. This
>>>> case, it seems to make an
>>>> alias rather than using binding for shadowing:
>>>>
>>>> bind x = a.property.with.a.long.path
>>>> print x  // 42
>>>> print(a.property.with.a.long.path == 42) => true
>>>>
>>>> presumably this means:
>>>>
>>>> x += 1
>>>> print(a.property.with.a.long.path)  // 43
>>>>
>>>> DISCUSSION
>>>>
>>>> I'm throwing these both out there. I have nothing to really say about
>>>> Tino's but I do think my and Jacob's
>>>> proposal has the advantages of:
>>>>
>>>> * Simplifying an mildly complex and potentially misleading statement
>>>> * Creating a deliberate and controlled rather than accidental shadowing
>>>> style
>>>>
>>>> Have at it.
>>>>
>>>> -- Erica
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>
>>>>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>
>>>
>>>
>>
>> --
>>   -- Howard.
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160202/77174fb9/attachment-0001.html>


More information about the swift-evolution mailing list