Thanks for pointing this out! But I think `foo?.bar(baz(42))` should be 
equivalent to:

```
if let foo = foo {
    let x = baz(42)
    foo.bar(x)
}
```

IMHO, this is consistent with my example. Instead of worrying about 
"short-circuit", we can just treat ? as the syntax sugar of if let?

> On Aug 15, 2016, at 4:07 PM, Jean-Daniel Dupas <[email protected]> wrote:
> 
>> 
>> Le 15 août 2016 à 10:01, Justin Jia via swift-evolution 
>> <[email protected] <mailto:[email protected]>> a écrit :
>> 
>> 
>>> On Aug 15, 2016, at 3:53 PM, Charlie Monroe <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>>> 
>>>> On Aug 15, 2016, at 9:46 AM, Justin Jia via swift-evolution 
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>> I think the `?` will make the return an optional. So your example should 
>>>> add another ? at the end.
>>>> 
>>>> ```
>>>> print(foo(bar(42)?, baz(42)?)?)
>>> 
>>> This reads terribly, IMHO.
>>> 
>> 
>> I agree that this reads terribly. But this is only an edge case. I would 
>> prefer `let output = foo(bar(42)?, baz(42)?); print(output?)`. However, I 
>> want to argue that for most cases “?” reads better than “if let”.
>> 
>>>> ```
>>>> 
>>>> The above example should be equivalent to:
>>>> 
>>>> ```
>>>> let x = bar(42) // X is optional
>>>> let y = baz(42) // Y is optional
>>>> 
>>>> let z = foo(x?, y?) // Z should be optional now
>>>> print(z?)
>>>> ```
>>>> 
>>>> which should be equivalent to;
>>>> 
>>>> ```
>>>> let x = bar(42)
>>>> let y = baz(42)
>>>> 
>>>> if let x = x, let y = y {
>>>>     z = foo(x, y)
>>>> }
>>> 
>>> What if baz doesn't return optional?
>>> 
>> 
>> If baz doesn’t return optional, then we don’t even need this syntax:
>> 
>> We can just write: `z(bar(42)?, baz(42)` and treat baz(42) like normal.
>> 
>> Which should be equivalent to:
>> 
>> ```
>> ```
>> let x = bar(42)
>> let y = baz(42)
>> 
>> if let x = x {
>>     z = foo(x, y)
>> }
>> ```
>> 
> 
> It is not consistent which what I expect when calling foo?.bar(baz(42))
> 
> In that case, if foo is nil, bad is never evaluated.
> 
> 
>>> if let x = bar(42) {
>>>     let y = baz(42)
>>>     z = foo(x, y)
>>> }
>>> 
>>> or 
>>> 
>>> let y = baz(42)
>>> if let x = bar(42) {
>>>     z = foo(x, y)
>>> }
>>> 
>>> 
>>> If both are evaluated, this is really inconsistent with
>>> 
>>> if let x = bar(42), y = baz(42) { ... }
>>> 
>>> which will short-circuit and baz will not be evaluated if x is evaluated as 
>>> nil.
>>> 
>>>> 
>>>> if let z = z {
>>>>     print(z)
>>>> }
>>>> ```
>>>> 
>>>> We don’t need to worry about “short-circuit” now because it should be 
>>>> equivalent to the above syntax.
>>>> 
>>>> > It has been mentioned before (more than once, perhaps, but not in its 
>>>> > own thread I don't think, so good luck finding it). IIRC, one of the 
>>>> > problems is that it's unclear what happens if your function takes 
>>>> > multiple arguments. Does evaluation proceed from left to right? does it 
>>>> > short-circuit? Put concretely:
>>>> > 
>>>> > ```
>>>> > func bar(_ x: Int) ->Int? { /* side effects */ }
>>>> > func baz(_ y: Int) ->Int? { /* side effects */ }
>>>> > func foo(_ z: Int, _ a: Int) ->Int { /* ... */ }
>>>> > 
>>>> > print(foo(bar(42)?, baz(42)?))
>>>> > ```
>>>> > 
>>>> > Does baz(42) get evaluated if bar returns nil? Does bar(42) get 
>>>> > evaluated if baz returns nil?
>>>> > 
>>>> > 
>>>> > On Mon, Aug 15, 2016 at 2:02 AM, Justin Jia via 
>>>> > swift-evolution<[email protected] 
>>>> > <mailto:[email protected]>(mailto:[email protected] 
>>>> > <mailto:[email protected]>)>wrote:
>>>> > > Hi!
>>>> > > 
>>>> > > I don’t know if this has came up before. I tried to search though the 
>>>> > > mailing list but didn’t find any related threads.
>>>> > > 
>>>> > > This is purely a syntactic thing (which I know it’s the lowest 
>>>> > > priority for Swift 4), but I think it’s an important one.
>>>> > > 
>>>> > > Let’s say we have a struct with a function:
>>>> > > 
>>>> > > ```
>>>> > > struct Foo {
>>>> > > func bar(x: Int)
>>>> > > }
>>>> > > ```
>>>> > > 
>>>> > > We can use optionals:
>>>> > > 
>>>> > > ```
>>>> > > let foo: Foo? = nil
>>>> > > let x = 1
>>>> > > foo!.bar(x: x) // Able to compile, but will cause runtime error
>>>> > > foo?.bar(x: x) // Able to compile, and won't cause runtime error
>>>> > > ```
>>>> > > 
>>>> > > However:
>>>> > > 
>>>> > > ```
>>>> > > let foo = Foo()
>>>> > > let x: Int? = nil
>>>> > > foo.bar(x: x!) // Able to compile, but will cause runtime error
>>>> > > foo.bar(x: x?) // Won't compile
>>>> > > ```
>>>> > > 
>>>> > > I propose that we should allow `foo.bar(x: x?)`, which should be 
>>>> > > equivalent to:
>>>> > > 
>>>> > > ```
>>>> > > if let x = x {
>>>> > > foo.bar(x: x)
>>>> > > }
>>>> > > ```
>>>> > > 
>>>> > > What do you think?
>>>> > > 
>>>> > > Thanks,
>>>> > > Justin
>>>> > > 
>>>> > > _______________________________________________
>>>> > > swift-evolution mailing list
>>>> > > [email protected] 
>>>> > > <mailto:[email protected]>(mailto:[email protected] 
>>>> > > <mailto:[email protected]>)
>>>> > > https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> > > <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> > 
>>>> > 
>>>> > 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to