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'?

Accepted Reply

Using lowThan need import other module, see here

  • That's exactly what the doc states: group must come from another module.    need to be in different modules to allow lowerThan

Add a Comment

Replies

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. So I add it: precedencegroup Range { } precedencegroup Comparative { } Now, ' lowerThan: Additive ' show error: Precedence group cannot be given lower precedence than group in same module; make the other precedence group higher than this one instead. So,I try make 'Range' or 'Comparative' higherThan any precedencegroup I know, both too. And then, I try change 'Range' to 'RangeFormationPrecedence', 'Comparative' to 'ComparisonPrecedence', it's error too. But this is no error: precedencegroup TestPrecedence {     higherThan: ComparisonPrecedence     lowerThan: RangeFormationPrecedence }

    I tried everything I could think of, I cann't make a precedencegroup lowerThan custom precedencegroup.

Add a Comment

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.

Using lowThan need import other module, see here

  • That's exactly what the doc states: group must come from another module.    need to be in different modules to allow lowerThan

Add a Comment