A question about use 'lowerThan' when I learning 'precedencegroup'

I see the ' Improved operator declarations ' , about lowerThan has this:

There are times when we want to insert an operator below an existing one. If that existing operator resides in another module, we can use lowerThan relationship.

So, I try:

precedencegroup aPrecedence {}

precedencegroup bPrecedence {

    higherThan: aPrecedence

}

precedencegroup cPrecedence {

    higherThan: bPrecedence

}

precedencegroup ePrecedence {

    higherThan: cPrecedence

}

precedencegroup dPrecedence {

    higherThan: bPrecedence

    lowerThan: ePrecedence// error: Precedence group cannot be given lower precedence than group in same module; make the other precedence group higher than this one instead

}

but this is no error:

precedencegroup testPrecedence {

    higherThan: ComparisonPrecedence

    lowerThan: RangeFormationPrecedence

}

I cann't understand; How to use 'lowerThan'?

Answered by LonKing in 686421022

Using lowThan need import other module, see here

From your code, I do not see that ePrecedence is in a different module than dPrecedence.

See the doc example:

// module Swift
precedencegroup Additive { higherThan: Range }
precedencegroup Multiplicative { higherThan: Additive }

// module A
precedencegroup Equivalence {
  higherThan: Comparative
  lowerThan: Additive  // possible, because Additive lies in another module
}
infix operator ~ : Equivalence

1 + 2 ~ 3    // same as (1 + 2) ~ 3, because Additive > Equivalence
1 * 2 ~ 3    // same as (1 * 2) ~ 3, because Multiplicative > Additive > Equivalence
1 < 2 ~ 3    // same as 1 < (2 ~ 3), because Equivalence > Comparative
1 += 2 ~ 3   // same as 1 += (2 ~ 3), because Equivalence > Comparative > Assignment
1 ... 2 ~ 3  // error, because Range and Equivalence are unrelated

Note: names of groups should better start as UpperCase, like Dprecedence or DPrecedence.

I try the example, but the 'Range' and 'Comparative' show error: Unknown precedence group

Names of groups may have changed to:

  • RangeFormationPrecedence
  • ComparisonPrecedence

And this compiles:

precedencegroup Additive {
    higherThan: RangeFormationPrecedence, Equivalence
}
precedencegroup Multiplicative { higherThan: Additive }

// module A
precedencegroup Equivalence {
  higherThan: ComparisonPrecedence
//  lowerThan: Additive  // possible, because Additive lies in another module
}
infix operator ~ : Equivalence

Which confirms what you say about the issue with lowerThan. I don't understand the reason why they need to be in different modules to allow lowerThan. And documentation is really minimal on this. Could be worth a bug report on documentation.

Accepted Answer

Using lowThan need import other module, see here

A question about use 'lowerThan' when I learning 'precedencegroup'
 
 
Q