Alice ML is based on the Standard ML programming language (SML), as defined in
However, Alice ML features a number of extensions relative to SML (including most current proposals for Successor ML).
You should also be aware of some
Alice ML defines some additional identifiers as reserved words:
any assert assertd comp constructor exttype fct finally from import non lazy pack spawn unpack withfun withval _file_ _line_
The following grammar collects all other syntactic extensions of Alice ML relative to Standard ML. Derived forms are marked (*).
longid | ::= | id | |
longid . id | long identifiers |
atexp | ::= | ... | |
comp <ann in> spec with dec end | component1 | ||
#[ exp1 , ... , expn ] | vector (n≥0) | ||
{ atexp where exprow } | record update | ||
( exp1 ; ... ; expn <;>) | sequential (n≥2) | ||
let dec in exp1 ; ... ; expn <;> end | local declaration (n≥1) | ||
_file_ | source file (*) | ||
_line_ | source line (*) | ||
exp | ::= | ... | |
exp handle <|> match | handle exception | ||
case exp of <|> match | case analysis | ||
fn <|> match | function | ||
if exp1 then exp2 <else exp3> | conditional | ||
lazy exp | lazy | ||
spawn exp | concurrent | ||
exp1 finally exp2 | finalization (L) (*) | ||
rec pat => exp | recursion (*) | ||
pack strexp : sigexp | transparent packing | ||
pack strexp :> sigexp | opaque packing (*) | ||
assert<d> exp | boolean assertion (*) | ||
assert<d> exp of pat | pattern assertion (*) | ||
assert<d> exp raise pat | exception assertion (*) | ||
assert<d> exp do exp | boolean precondition (*) | ||
assert<d> exp of pat do exp | pattern precondition (*) | ||
exprow | ::= | ... | |
vid <: ty> <, exprow> | label as expression (*) | ||
... = exp <, exprow> | record extension |
1) The syntax of import items in a first-class component is restricted to the syntactic subclass of the corresponding descriptions, as used in signatures.
atpat | ::= | ... | |
#[ pat1 , ... , patn ] | vector (n≥0) | ||
( pat1 | ... | patn ) | alternative (n≥2) | ||
pat | ::= | ... | |
pat as pat | layered (R) | ||
pat if atexp | guarded (L) | ||
patrow | ::= | ... | |
... = pat <, patrow> | record extension |
ty | ::= | ... | |
_ | wildcard | ||
tyrow | ::= | ... | |
... : ty <, tyrow> | record extension |
dec | ::= | ... | 1) |
exttype extbind | extensible datatype | ||
constructor econbind | generative constructor | ||
open strexp | generalised open (*) | ||
do exp | statement | ||
fvalbind | ::= | <lazy | spawn> | lazy/concurrent function (m,n≥1) (*) |
<|> <op> vid atpat11 ... atpat1n <: ty1> = exp1 | |||
| <op> vid atpat21 ... atpat2n <: ty2> = exp2 | |||
| ... | |||
| <op> vid atpatm1 ... atpatmn <: tym> = expm | |||
<and fvalbind> | |||
datbind | ::= | tyvarseq tycon = <|> conbind <and datbind> | datatype binding |
extbind | ::= | tyvarseq tycon | extensible datatype |
econbind | ::= | <op> vid <of ty> : tyvarseq longtycon <and econbind> | new constructor |
<op> vid = <op> longvid <and econbind> | synonym | ||
strbind | ::= | ... | |
_ <: sigexp> = strexp <and strbind> | anonymous structure (*) | ||
funbind | ::= | <lazy | spawn> strid strpat1 ... strpatn < : | :> sigexp> = strexp <and funbind> | functor binding (n≥1) (*) 2 |
1) The extended phrase class dec contains all of Standard ML's dec, strdec and topdec.
2) See the module syntax summary for a more precise grammar of functor bindings.
strexp | ::= | ... | |
( strexp ) | parentheses | ||
( dec ) | structure (*) | ||
strexp strexp | functor application 1 | ||
fct strpat => strexp | functor | ||
unpack infexp : sigexp | unpacking | ||
lazy strexp | laziness | ||
spawn strexp | concurrency | ||
strpat | ::= | strid : sigexp | parameter |
_ : sigexp | anonymous parameter (*) | ||
( strid : sigexp ) | parameter (*) | ||
( _ : sigexp ) | anonymous parameter (*) | ||
( spec ) | signature as parameter (*) |
1) See the module syntax summary for a more precise grammar of structure expressions and functor application.
sigexp | ::= | ... | |
longsigid | signature identifier | ||
( sigexp ) | parentheses | ||
( spec ) | signature (*) | ||
fct strpat -> sigexp | functor | ||
sigexp1 -> sigexp2 | non-dependent functor 1 |
1) See the module syntax summary for a more precise grammar of functor signatures.
spec | ::= | ... | |
exttype extdesc | extensible datatype | ||
constructor econdesc | generative constructor | ||
functor fundesc | functor specification (*) | ||
signature sigdesc | signature specification | ||
datdesc | ::= | tyvarseq tycon = <|> condesc <and datdesc> | datatype description |
extdesc | ::= | tyvarseq tycon | extensible datatype |
econdesc | ::= | <op> vid <of ty> : tyvarseq longtycon <and econdesc> | new constructor |
fundesc | ::= | strid strpat1 ... strpatn : sigexp <and fundesc> | functor description (n≥1) (*) 1 |
sigdesc | ::= | sigid <= sigexp> <and sigdesc> | signature description |
1) See the module syntax summary for a more precise grammar of functor specifications.
component | ::= | ann <program> | component |
ann | ::= | import imp from string | import announcement |
import string | import all (*) | ||
empty | |||
ann <;> ann | |||
imp | ::= | val valitem | |
type typitem | |||
datatype datitem | |||
exttype extitem | |||
constructor econitem | |||
exception exitem | (*) | ||
structure stritem | |||
functor funitem | (*) | ||
signature sigitem | |||
infix <d> vid1 ... vidn | (n≥1) | ||
infixr <d> vid1 ... vidn | (n≥1) | ||
nonfix vid1 ... vidn | (n≥1) | ||
empty | |||
imp <;> imp | |||
valitem | ::= | <op> vid <and valitem> | |
<op> vid : ty <and valitem> | |||
typitem | ::= | tycon <and typitem> | |
tyvarseq tycon <and typitem> | |||
datitem | ::= | tycon <and datitem> | |
tyvarseq tycon = <|> conitem <and datitem> | |||
conitem | ::= | <op> vid <of ty> <| conitem> | |
extitem | ::= | tycon <and extitem> | |
tyvarseq tycon <and extitem> | |||
econitem | ::= | <op> vid <and econitem> | |
exitem | ::= | <op> vid <and exitem> | (*) |
<op> vid of ty <and exitem> | (*) | ||
stritem | ::= | strid <and stritem> | |
strid : sigexp <and stritem> | |||
funitem | ::= | strid <and funitem> | (*) |
strid strpat1 ... strpatn : sigexp <and funitem> | (n≥1) (*) 1 | ||
sigitem | ::= | sigid <and sigitem> |
1) See the component syntax summary for a more precise grammar of functor items.