Operator Fixity¶
A fixity declaration, introduced by the syntax
keyword followed by fixity
,
defines an operator's precedence and associativity. The syntax varies based on
the operator's arity, associativity, and precedence.
- Arity declaration of an operator with no precedence or associativity:
syntax fixitiy <name> := <arity>;
Where <arity>
is either unary
or binary
.
This is equivalent to:
syntax fixitiy <name> := <arity> {};
- Associativity declaration of an operator with no precedence:
syntax fixitiy <name> := <arity> { assoc := <associativity> };
Where <associativity>
is either left
, right
, or none
.
-
Precedence declaration of an operator with no associativity:
-
Equal precedence to another operator:
syntax fixitiy <name> := <arity> { same := otherOperatorName };
- Higher precedence than other operators:
syntax fixitiy <name> := <arity> {
above := [otherOperatorName1;...; otherOperatorNameN] };
- Lower precedence than other operators:
syntax fixitiy <name> := <arity> {
below := [otherOperatorName1;...; otherOperatorNameN] };
- Associativity and precedence declaration of an operator:
syntax fixitiy <name> := <arity> {
assoc := <associativity>;
above := [otherOperatorName1;...; otherOperatorNameN]
};
Examples of Fixity Declarations¶
Below are a few common fixity declarations for operators in Juvix's standard library.
syntax fixity rapp := binary {assoc := right};
syntax fixity lapp := binary {assoc := left; same := rapp};
syntax fixity seq := binary {assoc := left; above := [lapp]};
syntax fixity functor := binary {assoc := right};
syntax fixity logical := binary {assoc := right; above := [seq]};
syntax fixity comparison := binary {assoc := none; above := [logical]};
syntax fixity pair := binary {assoc := right};
syntax fixity cons := binary {assoc := right; above := [pair]};
syntax fixity step := binary {assoc := right};
syntax fixity range := binary {assoc := right; above := [step]};
syntax fixity additive := binary {assoc := left; above := [comparison; range; cons]};
syntax fixity multiplicative := binary {assoc := left; above := [additive]};
syntax fixity composition := binary {assoc := right; above := [multiplicative]};