[swift-evolution] The bind thread
Paul Cantrell
cantrell at pobox.com
Mon Feb 1 17:11:58 CST 2016
The thing I like about “if let x = y” over all these alternatives — either shorthand like “ifsome” or Ceylon/Kotlin-like expression analysis— is that it generalizes to y being an arbitrary expression.
No special case needed for this:
if let x = foo.bar?.baz
…or this:
if let x = y as? SomeType
They just fall out naturally.
P
> On Feb 1, 2016, at 5:04 PM, Howard Lovatt via swift-evolution <swift-evolution at swift.org> wrote:
>
> There is a language, Nice (related to Java), that does:
>
> if x != nil {
> // x is unwrapped
> }
>
> As Andrew has already suggested as a possibility. However I am not sure that it is a great idea because why should this particular if statement have 'magic'?
>
> How about:
>
> ifsome x { // Equivalent to current `if let x = x`, note `ifsome` is one word
> // x is unwrapped
> }
>
> This doesn't use `bind` which has some baggage, it doesn't use `var` or `let` which have other meanings, `ifsome` is an unusual word and hence unlikely to be useful as a name, and it is clear it is not a normal `if` statement.
>
> Don't change `case` clauses, they are not confusing, they do introduce a new variable and hence `let` and `var` are appropriate.
>
> On Tuesday, 2 February 2016, Andrew Bennett via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
> 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 <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 <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 <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 <https://lists.swift.org/mailman/listinfo/swift-evolution>
>
>
>
>
> --
> -- Howard.
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160201/727b91c9/attachment.html>
More information about the swift-evolution
mailing list