[swift-evolution] [Proposal] Custom operators

Антон Жилин antonyzhilin at gmail.com
Mon Apr 4 18:06:21 CDT 2016

Apr 5, 2016, Maximilian Hünenberger wrote:

> Am 04.04.2016 um 08:06 schrieb Антон Жилин <antonyzhilin at gmail.com
> <javascript:_e(%7B%7D,'cvml','antonyzhilin at gmail.com');>>:
> 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 <)

I meant, are names `precedenceLessThan`, `precedenceEqualTo` a bit clunky?

precedence(lessThan: +)
precedence(equalTo: +)

It also solves my concern about dictionary inside braces.

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 {
>     *, /
> }
> precedence(Additive lessThan Multiplicative)
> infix operator +- {
>     associativity: left
> }
> extension Additive {
>     +-, -+, ++, --
> }

Precedence groups have a great benefit of additional symmetry. Transitive
precedence propagation, on the other hand, also has benefits:

1. It does not introduce new entities, just some rules for compiler
2. It does not add new keywords. In your current wording, we have to take
precedence and precedenceGroup as keywords, that's why I
originally preferred directives
3. We actually think in terms of operators, not groups.
If I want to say that my operator should have the same priority as `+`, I'd
rather say that I want it to have priority of plus and minus, not "belong
to multiplicative group".
If I declare <$> and want it to have same priority as <*>, it would be more
difficult to invent some name for their group like FunctorManipulator.

On the other hand, in your solution you have a list of global rules
and don't really need braces. How about this?

#precedence(Additive, less, Multiplicative)
#operator(+, infix, associativity: left, group: Additive)
#operator(*, infix, associativity: left, group: Multiplicative)
#operator(<>, infix)

So precedence group is just a tag that can be used in precedence rules and
assigned to operators at declaration.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160405/374ca585/attachment.html>

More information about the swift-evolution mailing list