[swift-evolution] [Last second] Precedence of nil-coalescing operator seems too low

Erica Sadun erica at ericasadun.com
Mon Sep 5 14:47:21 CDT 2016


At this point, I'm not sure whether this is an -evolution question or a -dev question. The latter would be much easier to work on at this time and could potentially be postponed to a dot release. I know that any conversation not directly related to 3.0 right now is a Bad Thing. 

And I suspect that Steven C is probably the right person to know about wrangling precedence and existing standards.

-- E


> On Sep 5, 2016, at 12:30 AM, Jacob Bandes-Storch <jtbandes at gmail.com> wrote:
> 
> Now you've gotten me thinking about precedence of other operators too.
> 
> Since ?? is prone to causing confusion in either direction (cf. your example and my example), it could be put in its own group whose relation to the numeric operators is intentionally undefined (thus requiring parens).
> 
> I don't know about other folks, but I'll certainly get confused if & and | and ^ are mixed. What if we removed their relation to each other (requiring parens when mixing them)?
> 
> <proposed-precedence.png>
> 
> For comparison (ha), here's what we have today:
> 
> <current-precedence.png>
> 
> Jacob
> 
> On Sat, Sep 3, 2016 at 10:20 PM, Erica Sadun <erica at ericasadun.com <mailto:erica at ericasadun.com>> wrote:
>> On Sep 3, 2016, at 10:15 PM, Jacob Bandes-Storch <jtbandes at gmail.com <mailto:jtbandes at gmail.com>> wrote:
>> 
>> Perhaps-conversely, what should this code do?
>> 
>>     let nextIndex = foundIndex ?? lastIndex + 1
>> 
>> Jacob
> 
> It's a good counter example. And there's no optional-associative option.
> 
> -- E
> 
>> 
>> On Sat, Sep 3, 2016 at 9:05 PM, Erica Sadun via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> Given: `let x = Optional(3)` then
>> `let y = 5 + x ?? 2` will not compile
>> but 
>> `let y = 5 + (x ?? 2)` will.
>> 
>> Should NilCoalescingPrecedence be raised? The current operator precedence chain is:
>> 
>> BitwiseShiftPrecedence > MultiplicationPrecedence > AdditionPrecedence > RangeFormationPrecedence > CastingPrecedence > NilCoalescingPrecedence > ComparisonPrecedence > LogicalConjunctionPrecedence > LogicalDisjunctionPrecedence > TernaryPrecedence > AssignmentPrecedence > FunctionArrowPrecedence > [nothing]
>> 
>> It seems to me that `NilCoalescingPrecedence` should probably be higher than `MultiplicationPrecedence` and possibly higher `BitwiseShiftPrecedence` as its job is to produce an unwrapped value that can then be operated upon.
>> 
>> I think CastingPrecedence should be even higher because
>> `expression as? T ?? fallback value`
>> should be parsed as
>> `(expression as? T) ?? (fallback value)`
>> 
>> I apologize profusely because I know this is beyond last minute,
>> 
>> -- E
>> 
>> 
>> _______________________________________________
>> 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/20160905/7375eb5b/attachment.html>


More information about the swift-evolution mailing list