[swift-evolution] Proposal: Python's multiple comparisons and multiple assignments
Kenny Leung
kenny_leung at pobox.com
Fri Dec 18 12:44:43 CST 2015
So no man is an
island, but snowman is an
operator - hah!
-Kenny
> On Dec 17, 2015, at 8:30 PM, Jordan Rose via swift-evolution <swift-evolution at swift.org> wrote:
>
> Joe, Rob Rix, Scott Perry, and I actually tossed around some ideas about chained operators on Twitter last month. My initial idea was just to make operators variadic:
>
>> func ☃(values: Int...) -> Int
>> a ☃ b ☃ c ☃ d
>
> But that doesn't allow mixing < and <=. I'm fine with disallowing mixing in general, but those two you usually want to choose from. Joe's idea is a little more extensible:
>
>> operator •, ¶ { associativity chained(§) }
>> a • b ¶ c ==> (a • b) § (b ¶ c)
>
> But it's still a little weird. (Are there any useful chains other than "&&"?) Thus the canonical way to compare ranges remains the match operator:
>
> a <= b < c
> b ~= a..<c
>
> …as long as your lower bound uses <=.
>
> (P.S. You can totally fake this by overloading < and <= with a mess of operators and intermediate types, but it's pretty nasty, and I wouldn't inflict the errors you get out on an average developer.)
>
>
> As for multiple assignments, we mainly didn't want people doing other things with the result of an assignment expression (e.g. "foo(x = bar())"). Chained assignment has interesting semantics for computed properties, though: for "a.foo = b.bar = c", does "a.foo" get assigned the value of "c" or "b.bar"?
>
> It's feasible, but it's not very common in practice, and it would mess up our AST a bit.
>
> Jordan
>
>
>> On Dec 17, 2015, at 10:49 , Sune Foldager via swift-evolution <swift-evolution at swift.org> wrote:
>>
>> Hmm, I don’t think it’s worth the added complexity that it will surely result in. Also, for non-standard operators it’s hard to see how it would be evaluated. Would:
>>
>> x op1 y op2 z
>>
>> Turn into:
>>
>> (x op1 y) && (y op2 z)
>>
>> for boolean-returning operators? I guess that could make sense, but I’m not sure I like the syntax much. I think it looks ok for x < y < z, but otherwise it gets confusing.
>>
>> -Sune
>>
>>> On 17 Dec 2015, at 19:44, Amir Michail via swift-evolution <swift-evolution at swift.org> wrote:
>>>
>>> Some Python examples:
>>>
>>> if 2 < 3 < 4 == 4 <= 5 { … }
>>>
>>> a = b = c = 1
>>
>> _______________________________________________
>> 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
More information about the swift-evolution
mailing list