Users can define custom fixity for names/symbols. The scope of fixity definition is within the same file.
The keywords are
extern fun add (int, int): int symintr ~> symintr >> infix ~> (* make ~> infix, non-assoc *) infixl ~> add (* make ~> and `add` infix, left-assoc *) infixl (+) ~> >> (* make ~> and >> infix, left-assoc, having the same precedence as (+) note that this name/symbol as to be in parenthesis in order to be parsed as a precedence definition *) infixr 50 ~> >> (* make ~> and >> infix, right-assoc, having precedence 50. *) postfix (= + 1) ^ (* make ^ postfix, having the same precedence as (=) plus 1. note that the `+` need to be separated from `=`, or it will be parsed as part of the symbol *) nonfix add (* make `add` nonfix, which means it can only be used as functions from this point on. *)
Roughly speaking the syntax is as follows. (In a BNF-like syntax)
keyword ::= "infix" | "infixl" | "infixr" | "postfix" | "prefix" opr ::= symbol | name precedence ::= number | "(" opr (("+"|"-") number)? ")" fixity ::= keyword precedence? opr+ | "nonfix" opr+
In addition, users can change fixity temporarily using the following syntax.
- change a name to infix, non-assoc:
name(a,b) => a \name b
- change a symbol to prefix:
a + b => op+ (a, b)