|
types |
unit, int, real, bool, char, string, exn |
basic types, NB. ( ):unit |
consts |
127:int, 0x7F |
an integer constant (and hexa-decimal) |
3.14:real, 0.314e1, 31.4E~1 |
reals, floating point |
~ |
unary minus, NB not `-' |
true:bool, false:bool |
|
#"a":char | |
"fred":string, "":string "multi-line \ string" |
|
ops |
+, -, *, /, div, mod |
arithmetic operators NB. /:real*real->real |
^ | string concatenation |
=, <, >, <=, >=, <>
e.g. 2<10, "2">"10" |
comparison operators NB. =, <> do not apply to reals |
not, andalso, orelse |
boolean operators (short-cutting) |
if e then et else ef |
|
types |
(e1, e2, ...): t1*t2*... | tuple : product type |
fn x=>e :tx->te |
function : function type |
coercions |
real:int->real | |
ord:char->int, chr:int->char,
str:char->string,
explode:string->char list,
implode:char list->string |
chars <-> strings |
tuples, records |
#1(11,22,33) = 11, #2, etc. | tuple, extract component |
{id1=e1, ...}
#id1{id1=e1,...}=e1 |
record, extract field |
strings |
substring("012345",2,4)="234" |
also see coercions |
lists |
[]:'t list, [1,2,3]:int list |
list value : list type |
nil, [] | empty list |
:: :'t*'t list -> 't list |
list constructor, [1,2] = 1::(2::nil) |
hd:'t list->'t, tl:'t list -> 't list |
list head and tail operators |
null:'t list -> bool | test empty? |
@: 't list * 't list -> 't list |
list append, concatenate |
vector |
#[1,2,3] :int vector | NB. immutable |
vector [1,2,3] = #[1,2,3] |
convert list to vector |
ref |
ref 7 : int ref | ref value : ref type |
! | :'t ref -> 't, de-reference |
:= | assign to, change, a ref |
lexical |
fred, Jane_Doe, x1, x'y | identifiers |
( ) [ ] { } " . , ; | reserved |
+ - / * < > = ! @ # $ % ^ & ` ~ \ | ? : |
chars for symbolic ids. -- be careful |
't etc. | type variable |
syntax |
let decs in exp end |
local declarations, see
block structure
|
(e1;e2;...;en) |
expression returns en |
if e then et else ef |
equiv. case e of true=>et | false=>ef; |
case e of <match> | |
while e do e' | NB. returns ():unit |
decs. |
val x = e | value declaration |
fun f x = e | function declaration |
fun f(x,t) = e |
uncurried function :tx*ty->te |
fun f x y = e |
curried function :tx->ty->te |
fun f pat1= e1
| f pat2= e2 |... |
definition "by cases", by pattern matching |
type {tparams} id = type_exp | |
datatype {tparams} id = c1 of type |... |
type declaration |
exceptions |
Div, Chr, Empty,... | standard exceptions |
exception i |
declare exception, i:exn, ... |
exception i of t |
... with parameter(s) |
raise i | |
e handle <match> | handle exception |
|
www #ad:
SML:
:: | cons |
[x1,...] | list |
[ ] | list |
@ | append |
fn => | &lambda . |
: | has type |
Compared
|
|
|