Infix symbols

Sequences of ``operator characters'', such as <=> or !!, are read as a single token from the infix-symbol or prefix-symbol class:

infix-symbol:
      (= | < | > | @ | ^ | | | & | ~ | + | - | * | / | $ | %) {operator-char}

prefix-symbol:
      (! | ?) {operator-char}

operator-char:
      ! | $ | % | & | * | + | - | . | / | : | ; | < | = | > | ? | @ | ^ | | | ~

Tokens from these two classes generalize the built-in infix and prefix operators described in chapter 3:

expr:
      ...
   |  prefix-symbol expr
   |  expr infix-symbol expr

variable:
      ...
   |  prefix prefix-symbol
   |  prefix infix-symbol

No #infix directive (section 4.10) is needed to give infix symbols their infix status. The precedences and associativities of infix symbols in expressions are determined by their first character(s): symbols beginning with ** have highest precedence (exponentiation), followed by symbols beginning with *, / or % (multiplication), then + and - (addition), then @ and ^ (concatenation), then all others symbols (comparisons). The updated precedence table for expressions is shown below. We write ``*...'' to mean ``any infix symbol starting with *''.
Construction or operatorAssociativity
!... ?...--
. .( .[--
function applicationleft
constructor application--
- -. (prefix)--
**...right
*... /... %... modleft
+... -...left
::right
@... ^...right
comparisons (= == < etc.), all other infix symbolsleft
not--
& &&left
or ||left
,--
<- :=right
if--
;right
let match fun function try--
Some infix and prefix symbols are predefined in the default environment (see chapters 3 and 14 for a description of their behavior). The others are initially unbound and must be bound before use, with a let prefix infix-symbol = expr or let prefix prefix-symbol = expr binding.