Inline
> Am 04.04.2016 um 08:06 schrieb Антон Жилин <[email protected]>:
>
> Thank you for a helpful answer!
> I like the idea of overriding precedence from another module. We won't need
> to introduce additional keywords or visibility for operators. I will add it
> to the proposal.
>
> I assume you mean precedence inside braces of operator, then operator scope
> makes sense. Self operator could be omit as well, following the idea that we
> are introducing a new operator and want to compare it to others:
>
> infix operator * {
> associativity: left
> precedenceLess: ^
> precedenceEqual: /
> precedenceGreater: +
> }
> infix operator / {
> associativity: left
> precedenceLess: ^
> precedenceEqual: *
> precedenceGreater: +
> }
>
> Equivalent precedence rules would be allowed for symmetry in the operator
> definitions.
> We would still be able to reopen the scope and add precedence and
> associativity rules.
> I agree that this scheme has advantage of being a smaller change.
>
> I'm still concerned about syntax.
> Is it OK to have "less, equal, greater" in precedence name?
What do you mean by OK? Other operators like == are weird:
precedence(== == <)
// in comparison to
precedence(== equalTo <)
> Is it OK to have both curly brackets and dictionary syntax (a precedent, I
> guess)?
That could be a consistency problem. However I'd like to keep a declaration
syntax instead of defining operators through compiler directives.
> Is it OK to leave prefix and postfix operators always with empty braces?
>
I'm fine with that.
> Would it be better to have multiple precedence comparisons at once:
> precedenceGreater: +, -, *, /
> Or one comparison per line will be more readable?
>
> I will add this to alternatives, but will not swap it with currently stated
> syntax for now, waiting for some more response.
>
> What do you think?
>
> - Anton
After thinking more about it I came to the conclusion that we should have
something like "precedence groups" where all operators have the same precedence:
precedenceGroup Additive {
+, -
}
precedenceGroup Multiplicative {
*, /
}
// first we could allow an operator to be only
// in one p.Group. Later when we can infer
// precedences we can allow operators to be
// in more than one p.Group (if that is even necessary)
// precedence declaration
precedence(Additive lessThan Multiplicative)
// precedence declarations take
// "precedenceGroup"s and "operator"s.
// It could also work with extensions so you
// can easily insert it in the precedence hierarchy:
infix operator +- {
associativity: left
}
// more operator declarations ...
extension Additive {
+-, -+, ++, --
}
// the syntax I used is highly discussable.
// this should mainly be a concept suggestion.
// I think it allows for greater flexibility since you can define
// operator precedences much easier.
With kind regards
- Maximilian
>
> 2016-04-04 8:06 GMT+03:00 Maximilian Hünenberger <[email protected]>:
>> See inline
>>
>>> Am 03.04.2016 um 13:26 schrieb Ross O'Brien via swift-evolution
>>> <[email protected]>:
>>>
>>> There is a problem here of duplicated operators or custom precedence, and
>>> how that gets passed between modules.
>>> Assume there are three modules, A, B and C. B defines a custom operator **.
>>> A and C each define a custom operator ++, and their meanings are different
>>> (though, even if their meanings were the same, I'm not sure if they could
>>> unify).
>>>
>>> Module D uses A and B as dependencies and sets a custom precedence on ++
>>> and **. Module E uses B and C and has a different precedence on ++ and **.
>>> You're working on Module F which uses D and E. Which ++ and which
>>> precedence does F get implicitly?
>>>
>>
>> We could allow operator precedence overriding to resolve ambiguity. However
>> this overriding should only be module internal since it would override the
>> existing precedences in the other modules.
>>
>> @AHTOH
>> Why do you use #keyword ?
>> I think defining a operator with
>>
>> infix operator + {
>> associativity: left
>> }
>>
>> is perfectly fine since it is similar to class/struct/enum declaration.
>>
>> // and it's precedence
>> precedence(+ lessThan *)
>>
>> Note the missing "," and ":" before and after "lessThan" in order to give
>> both operators the same importance (minor issue).
>>
>> I feel that
>>
>> #precedence(+, lessThan: *)
>>
>> puts too much importance on the first operator.
>>
>> Best regards
>> - Maximilian
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected]
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution