Az ML programozási nyelv

Nyelvi elemek

Alapok

Nevek

Egy név lehet

Nem használhatók a következő, ún. fenntartott szavak vagy kulcsszók:

A neveket különféle osztályokba soroljuk:

var értékváltozó value variable long
con adatkonstruktor value constructor long
excon kivételkonstruktor exception constructor long
tyvar típusváltozó type variable
tycon típuskonstruktor type constructor long
lab mezőnév record label
unitid modulnév unit identifier

Infix operátorok

Egy név az infix vagy az infixr direktívával infix helyzetűnek deklarálható. Ha az id név infix helyzetű, akkor az exp1 id exp2 kifejezés, szükség esetén zárójelek között, minden olyan helyen használható, ahol az id(exp1, exp2) vagy az id{1= exp1, 2= exp2 } kifejezések egyébként használhatók. Infix helyzetű nevek mintában szintén használhatók.

Egy minősített nevet vagy egy olyan nevet, amelyet az op szócska előz meg, sohasem lehet infix helyzetben alkalmazni. Az infix, infixr és nonfix direktívák szintaxisa a következő (n 1):

infix < d > id1 … idn balra köt left associative
infixr < d > id1 … idn jobbra köt right associative
nonfix < d > id1 … idn nem köt non associative

A d decimális számjegy opcionális és a nevek precedenciáját adja meg; alapértelmezés szerinti értéke 0. Nagyobb szám magasabb precedenciát jelent. Az infix, infixr és nonfix direktívák érvényességi tartománya a szokásos, azaz a let kifejezésen és a local deklaráción belül lokális érvényűek. Azonos precedenciájú, de különféle balra kötő operátorok balra, azonos precedenciájú, de különféle jobbra kötő operátorok pedig jobbra kötnek. Tilos azonos prcedenciájú, de különböző kötésű operátorokat használni ugyanabban a kifejezésben.

Jelölések

Az SML alapnyelv szintaxisa

Kifejezések és klózsorozatok

exp ::=infexp exp : tytípusmegkötés (L)type constraint (L)
exp1 andalso exp2feltételes konjunkciósequential conjunction
exp1 orelse exp2feltételes alternációsequential disjunction
exp handle matchkivétel kezelésehandle exception
raise expkivétel jelzéseraise exception
if exp1 then exp2feltételes kifejezésconditional expression
else exp3
while exp1 do exp2iterációiteration
case exp of matchesetszétválasztáscase analysis
fn matchlambda-kifejezésfunction expression


infexp ::= appexp
       inf exp1 id inf exp2     infix alkalmazás     infixed application

appexp ::= atexp
       appexp atexp     (prefix) alkalmazás     application



atexp ::= sconállandó special constant
< op > longvarértékváltozó value variable
< op > longcon adatkonstruktor value constructor
< op > longexcon kivételkonstruktor exception constructor
{ < exprow > } rekord record
# lab rekordszelektor record selector
( ) 0-as 0-tuple
( exp1,…, expn ) n-es, n2 n-tuple, n 2
[ exp1,…, expn ] lista, n2 list, n 2
# [ exp1,…, expn ] vektor, n 2 vector, n 2
(exp1,…, expn) kifejezéssorozat, n 2 sequence, n 2
let dec
in exp1;…; expn lokális kifejezés, n 1 local expression, n 1
end
( exp )

exprow ::=
       lab = exp< , exprow >     kifejezéssor     expression row

match ::=
       mrule < | match >     klóz/változatsorozat     

mrule ::=
       pat => exp     klóz, változat      match, rule

Deklarációk és kötések

dec ::= val tyvarseq valbind értékdeklaráció value declaration
un tyvarseq fvalbind f függvénydeklarációfunction declaration
type typbind típusdeklaráció type declaration
datatype datbind adattípus deklaráció datatype declaration
< withtype typbind >
abstype datbindabstípus deklaráció abstype declaration
< withtype typbind >
with dec end
exception exbind kivételdeklaráció exception declaration
local dec1 in dec2 end lokális deklaráció local declaration
open unitid1…unitidn open deklaráció, open declaration,
üres deklaráció empty declaration
dec1 < ; > dec2 deklaráció sorozat sequential declaration
infix < d > id1 idn  infix-direktíva, n 1 infix (left) directive, n 1
infixr < d > id1 idn infixr-direktíva, n 1 infixr (right) directive, n 1
nonfix id1 … idn nonfix-direktíva, n 1nonfix directive, n 1

valbind ::=
       pat = exp < and valbind >     értékkötés      value binding
       rec valbind < and valbind >     rekurzív kötés      recursive binding

fvalbind::= < op > var atpat11…atpat1n < :ty > = exp1 m, n ³ 1 | < op > var atpat21…atpat2n < :ty > = exp2 | … | < op > var atpatm1…atpatmn < :ty > = expm < and fvalbind >

typbind::=        tyvarseq tycon = ty < and typbind>

datbind::=        tyvarseq tycon = conbind < and datbind >

conbind::=        < op > con < of ty > < | conbind >

exbind ::=
       < op > excon < of ty > < and exbind >
       < op > excon = op longexcon < and exbind>

Megjegyzés: fvalbind fenti definíciójában, ha var infix helyzetűnek van deklarálva, akkor vagy meg kell előznie az op szócskának, vagy infix helyzetben kell használni. Ez azt jelenti, hogy a klózok elején op var (atpat, atpat’) helyett (atpat var atpat’) írható. A zárójelek elhagyhatók, ha atpat’ után közvetlenül :ty vagy = áll.