Title: Ievads funkcionalaja programme
1Ievads funkcionalaja programmešana
2Programmešanas veidi (paradigmas) 1
- Imperativa programmešana (PASCAL, BASIC, C, C,
ADA, FORTRAN, u.c.)Vesturiski pirmais
programmešanas veids, imite datora ka fiziskas
iekartas piedavato abstraktas mašinas modeli.
Mainiga jedziens, iespeja mainit mainiga vertibu
programmas izpildes gaita analogs datora
atminas šunas jedzienam. Pieškiršanas operators.
Viens centralais procesors secigi izpilda
instrukcijas. Programmas semantika dabiski
skaidrota ka instrukciju virkne. - Funkcionala programmešana
- Ideja programma ir funkcija, programmas izpilde
funkcijas pielietošana argumentam. - Mainigie analogiski ka matematika var glabat
patvaligu, bet fiksetu vertibu. Nav pieškiršanas
operatora. - Virknes kompozicijas vieta funkciju
kompozicija, ciklu vieta rekursija (tiras
funkcionalas programmas). Iespejamas funkcijas,
kuru argumenti un rezultati ari ir funkcijas
(augstakas kartas funkcijas). - Funkcionala programmešana valoda LISP 1960.
gada, talak krietni attistijusiespieejamas
valodas ar datu tipiem, strukturetam programmu
uzdošanas iespejam ML, HASKELL, MIRANDA.
Aplukosim tuvak valodu ML.
3Programmešanas veidi (paradigmas) 2
- Logiska programmešana PROLOG
- Programma zinašanu baze, apgalvojumi par to,
kas ir zinams par problemu apgabalu, kas ietver
zinas par iegustamo rezultatu. - Programmas izsaukums merka predikats.
Programmai janoskaidro, vai merka predikata
patiesumu var izvest no pieejamas zinašanu bazes.
Ja merka predikats satur mainigos, programma
atrod mainigo vertibas, ar kuram merka predikats
klust patiess. - Valoda PROLOG tira logiska programmešana,
plus risinajuma meklešanas vadibas direktivas. - Objektorienteta programmešana SIMULA, SMALLTALK,
C, JAVA, EIFFEL, u.c. - Programma ka aktivu objektu kopums. Katram
objektam atributi un metodes, publiska un privata
dala. Objekta tips klase, iespejamas klašu
hierarhijas, mantošana. - Viens no praktiski visnozimigakajam
programmešanas veidiem. - Paralela programmešana Paraleli programmu
izpildes pavedieni. Kopeja atminas izmantošana,
zinojumu apmaina (sinhronizacija, u.c.) - Vizuala programmešana vizualie objekti un to
klases, datu ievads caur formam, proceduru
izpilde, reagejot uz notikumiem.
4Funkcionala programmešana raksturojums
- Funkcionala programmešanas stila raksturojums
(funkcionala programmešana tira forma) - Programma ir funkcija, kas ieejas datus attelo
par izejas datiem. Programmas izpilde funkcijas
pielietošana argumentiem. - Visas proceduras un funkcijas skaidri nodala
ienakošas vertibas (argumentus) no izejošajam
vertibam (rezultatiem). - Netiek izmantoti mainiga (ka atminas šunai
piesaistita varda) un pieškiršanas operatora
jedzieni mainigie tiek aizstati ar parametriem. - Netiek izmantoti cikli cikli ir aizstati ar
rekursiviem izsaukumiem. - Funkcijas vertiba ir atkariga tikai no tas
parametru vertibas, un nevis no funkcijas
aprekinašanas kartibas, vai ari no izpildes cela,
kas novedis lidz šis funkcijas izsaukumam. - Funkcijas ir pilnvertigas (pirmas škiras)
vertibas, valodas izteiksmes lietojamas tapat ka
jebkadas citas vertibas. - Funkcionalas valodas ir pieejamas ari ipašibas,
kas atkapjas no ši stila. - Funkcionalas programmešanas butiskas iezimes
- Funkciju kompozicija ka butisks strukturizacijas
lidzeklis - Visparigas (augstakas kartas) funkcijas, kuru
argumenti ari ir funkcijas - Aizturetas izpildes paradigma (dala valodu)
iespejas darbibas definet bezgaligu objektu
limeni (ka matematiska notacija).
5Funkcionala programmešana ieskats vesture
- Funkcionalas programmešanas sakums Lambda
rekini, matematiska sistema funkciju uzdošanai un
aprekinašanai, 1935. gads. - l - termi M x lx.M M N x - mainigais
lx.M - abstrakcija (funkcija x ? M, parasti M
M(x)) M N - aplikacija terms - funkcija M tiek
pielietots argumenta termam N - Piemers funkciju x ? x2 apzime ka lx.x2
x2 var tikt ieviests - Fakts. Lambda rekinos var aprakstit tas un
tikai tas funkcijas, kas ir izrekinamas ar
Tjuringa mašinu. - Plašaka informacija nakamaja lekcija.
- Funkcionalas programmešanas valoda LISP, John
McCarthy, 1958.g. - Programmas, dati tiek uzdoti ka saraksti.
- Vertibas, kas ir funkcijas, ir tikpat plaši
lietojamas, ka jebkura cita vertiba. - Pielietojumi AI sfera.
- LISP Lots of Silly Parentheses
- Common Lisp populara LISP vide
- SCHEME vienkaršaka implementacija, apskatisim
nakamaja lekcija.
6Valoda ML ievads
- Valodai ML - interaktiva, interpretativa vide.
- Piemeri New Jersey SML vide
- - 3 5val it 8 int - ML sistema ka
atbildi uz lietotaja ievadu pazino definetas
vertibas tipu. - Izteiksmes tipu ML sistema
cenšas noteikt automatiski - Stingra tipu
sistema katrai vertibai, katrai izteiksmei savs
tips. - Iebuvetie tipi int, real, bool, unit,
string, char - - val x3.56.0 val vertibas deklaracija
val x 21.0 real - - val y xx Definetu vertibu var izmantot
jaunas definicijasval y 441.0 real - - fun sq n nn fun funkcijas
deklaracija val sq fn int -gt int - Funkcijas tips sastav no argumenta un rezultata
tipiem, ievietojam simbolu -gt. - val sq fn norade, ka defineta vertiba ir
funkcija. - Funkciju pec tas deklaracijas var izmantot
izteiksmes pielietot argumentiem - - sq 5 val it 25 int
7Valoda ML ievads (2)
- - fun sq n nn fun funkcijas
deklaracija val sq fn int -gt int - - sq 5 val it 25 int
- fun sq n nn Tips ir neviennozimigs, SML NJ
vide to uztvera ka fn int -gt int, citas ML
vides var zinot par kludu. - Iemesls , tapat ka ir parslogotas
(overloaded) funkcijas, kas pielietojamas gan
int, gan ari real tipa vertibam. - ML vide nevar pec dotas izteiksmes un taja
ieejošajiem operatoriem tipu noteikt
viennozimigi. - - fun sqq x x x real Konkreti specificets
argumenta tipsval sqq fn real -gt real - - fun sqz x real x x Cits variants, ka
specificet argumenta tipu. val sqz fn real
-gt real - Lai ML sistema konstatet (izvest) izteiksmes
tipu, vinai par to var signalizet dažados
veidos.
8Valoda ML ievads (3)
- - sq 5 val it 25 int
- - sqq 5.0 val it 25.0 real
- - sqq 5 ( tycon mismatch )
- Stingra tipu sistema nevar izteiksmes int un
real tipus likt vienu otra vieta. - Ja nepieciešams operaciju ar real parametru
pielietot int tipa argumentam, javeic atklata
tipu konversija - - sqq (real 5)val it 25.0 real
- - fun s x x 1 Iespejams ekvivalents
pieraksts - - val s fn x gt x 1 val s fn int -gt
int - Cits veids, ka definet funkciju, atbilst ?-termam
?x.x1 - Funkcija ari vertiba, funkciju var pierakstit
ari val notacija (s funkcija). fun ipaša
notacija, atvieglo funkciju uzdošanu. - - s 43 val it 44 int
9Valoda ML izteiksmes
- Izteiksmes valoda ML operacijas un precedence
1) (unarais -), not 2) , /, div, mod 3) ,
- 4) , lt, gt, ltgt, lt, gt 5) andalso, orelse -
aprekina vispirms kreiso pusi, tad, ja
nepieciešams, rekina ari labo (saisinata
aprekinašana) - - 14 div 3 val it 4 int Veselo skaitlu
dališana - - 14 mod 3 val it 2 int Atlikums dališana
- - 14.0 / 3.0 val it 4.66666666667 real
- - (14.0 / 3.0) 3.0 val it 14.0 real
- - 2 2 5 val it false bool
- - 3 2 andalso 2 div 0 5 val it false
bool - - 2 div 0 5 andalso 3 2 divide by zero
- - fun abs x if x gt 0 then x else x val
abs fn int -gt int - if operatora piemers valodas ML izteiksmes
ietvaros
10Valoda ML tipi char, string, unit
- Tips char char tipa konstantes a
- Funkcijas ord char -gt int, chr int -gt char,
str char -gt string size string -gt int,
explode string -gt char list, implode, - - fun hello "hello" val hello fn
unit -gt string - unit - tukšais (viena elementa) tips, satur tikai
(), atbilst C tipam void. Valoda ML katra tipa
jabut vismaz vienam elementam. - - hello val it fn unit -gt string
- - hello () val it hello string
- Funkcijas pielietošana unit tipa argumentam.
- - "Hello " "world!" Simbolu virknu
konkatenacijaval it "Hello world!" string
11Valoda ML lokalie mainigie funkcijas
Lokalas deklaracijasfun area(a,b,c) let val
p(abc)/2.0 in Math.sqrt(p(p-a)(p-b)(p-c))
end val area fn real real real -gt
real area(3.0,4.0,5.0)val it 6.0 real --
taisnlenka trijsturis piemera Trisstura laukuma
aprekinašanas formula, lokala deklaracija saisina
izteiksmes pierakstu, var uzlabot
lasamibu. Mainiga (simbola) p vertiba izteiksmes
aprekinašanas gaita tiek aprekinata tikai
vienreiz. Iespejams let izteiksmes definet ari
vairakus mainigos let val x 3 val y x x in
x y endval it 27 int val x 4val x 4
int let val x 3 and y x x in x y endval
it 48 int Lokalas vertibas deklaracijas, kas
atdalitas ar and tiek aprekinatas visas reize,
izmantojot tas mainigo vertibas, kas bija speka
let komandas izpildes sakuma bridi.
12Valoda ML bibliotekas un i/o
Lokalas deklaracijasfun area(a,b,c) let val
p(abc)/2.0 in Math.sqrt(p(p-a)(p-b)(p-c))
end Biblioteku atveršana- open Math atver
Math biblioteku, var rakstit vienkarši sqrt ML
vides atbilde uzskaitit biblioteka Math
pieejamos datu tipus, ka ari pieejamo vertibu un
funkciju tipus. Biblioteka define strukturu (ML
jedziens bibliotekas vienuma apzimešanai) ML
sistema piedavatas bibliotekas Bool, Byte,
Char, Int, Real, String, StringCvt, Word,
u.c. Failu apstrades biblioteka TextIO, piedava
funkcijas inputLine un output open
TextIO output(stdOut, inputLine(stdIn)) Tipu
konversija Int.toString int -gt string,
Int.fromString string -gt int option(sk. datu
tipus datatype a myoption NONE SOME of a
) Analogiski Bool tipam.
13Valoda ML praktiski ieteikumi
Darbs ar arejiem programmu tekstiem- use
area.sml Definiciju ielasišana-
OS.FileSys.getDir () Aktivas direktorijas
nosaukums- OS.FileSys.chDir () Fails
chdir.sml (piemeram) fun chdir s
OS.FileSys.chDir(OS.FileSys.getDir() "\\"
s)fun cdsml () OS.FileSys.chDir "C\\smlfun
cdbin () OS.FileSys.chDir "C\\sml\\binfun
dname () OS.FileSys.getDir () Piezime var
izpildit ari komandu open OS.Filesys Termu
izdrukas dzilums Compiler.Control.Print.printD
epth 100 Termu izdrukas garums
Compiler.Control.Print.printLength
1000 Kompilatora parametri open
Compiler.Control.Print
14Valoda ML realie skaitli
gt 1 1val it true bool gt 2.1
2.1Error operator and operand dont agree
equality type required Valoda ML vienadiba nav
defineta realiem skaitliem un funkcijam. Valoda
HASKELL šis jautajums atrisinats. gt Open Real gt
2.1 lt 2.1 val it false bool gt 2.1 lt 2.11
val it true bool Pieejamas funkcijas
floor, ceil, trunc, round, toString, u.c. Skatit
ari biblioteku IEEEReal.
15ML rekursija, un šabloni
- Faktoriala aprekinašanas funkcija
- fun fac n if n0 then 1 else n
fac(n-1)val fac fn int -gt int - Rekursivs izsaukums, fac n aprekinašanai izsauc
fac ar argumenta vertibu n-1. - Alternativs funkcijas definicijas variants,
izmanto šablonu atbilstibu - fun fac1 0 1 fac1 n n fac1(n-1) val
fac1 fn int -gt int - Šabloni var parklaties (neatkarigi no
prezentacijas veida), izpildes laika panems
pirmo, kas atbilst. - Ja šablons nepilnigs - bridinajums funkcijas
definešanas laika, ja izsaukums ar nedefinetu
vertibu programma apstajas ar kludas situaciju. - fun gcd x y if x y then x else if xgty then
gcd(x-y,y) else gcd(x,y-x)val gcd fn int -gt
int -gt int
16ML iznemuma situacijas
- fun fac n if n0 then 1 else n
fac(n-1) - fun fac1 0 1 fac1 n n fac1(n-1)
- fac 6val it 720 int
- fac 13( overflow )
- fac 1ieciklošanas
- exception facE Lietotaja defineta iznemuma
situacija - fun fac2 n if n lt 0 then raise facE
- else if n 0 then 1 else n fac2(n-1)
- fun fac3 n if n lt 0 then raise facE
- else (case n of 0 gt 1 n gt n fac3(n-1))
- Ilustreta ari case notacija izteiksmju veidošana.
17ML pari, korteži, polimorfisms
- (3,5) int int
- (3, true) int bool
- - fun divide(i, j) (i div j, i mod j) gt val
divide fn (int int) -gt (int int) - - fun max(x,y) int if x lt y then y else x gt
val max fn (intint)-gtint - - fun fst(x,y) x gt val fst fn (a b)
-gt a - - fun snd(x,y) y gt val snd fn (a b)
-gt b - a, b - tipu mainigie, parus var veidot no
dažadu tipu objektiem, funkcijas fst un snd var
pielietot visiem pariem - Viens un tas pats mainigais viena tipu izteiksme
visas vietas apzime vienu un to pašu tipu. - (1,3,5) int int int Kortežs garuma 3,
funkciju fst pielietot nevar- fst (1,3,5)
failure (tycon )
18Vairaku argumentu funkcijas
- 2 iespejas, ka definet skaitlu saskaitišanu
- - fun plus(a,b)int a b gt val plus fn
int int -gt int - - fun add a b a b int gt val add fn int
-gt int -gt int - Funkcijai plus vienmer vajag uzreiz abus
argumentus (vienu argumentu, kas ir abu skaitlu
paris) - Funkcija add var argumentus apstradat secigi,
vienu pec otra, šis ir parastais variants -
- int -gt int -gt int nozime int -gt (int -gt int)
- Funkcija, kas veselam skaitlim piekarto int -gt
int funkciju - - val succ add 1 funkciju add pielietojam
tikai vienam argumentam gt val succ fn int
-gt int - - succ 6 gt val it 7int
19Augstakas kartas funkcijas
- Funkcija, kuras viens no argumentiem ir funkcija
- - fun compose2 f x f(f x)
- gt val compose2 fn (a -gt a) -gt a -gt a
- - fun sq x x x int
- gt val sq fn int -gt int
- Funkcijai compose2 pirmais arguments ir funkcija
ar tipu (a -gt a) - Funkcija compose2 pielietota tikai vienam
argumentam - funkcijai sq - - val power4 compose2 sq
- gt val power4 fn int -gt int
- Funkcija compose2 funkcija ar 2 argumentiem.
Iespejams to pielietot vienam argumentam,
rezultats funkcija, kas gatava pienemt otru
argumentu. - compose2 sq aprekinašanas rezultata ieguto
funkciju power4 var pielietot talak - - power4 3
- gt val it 81 int
20Vairaku argumentu funkcijas papildmaterials
- - fun plus(a,b)int a b gt val plus fn
int int -gt int - - fun add a b a b int gt val add fn int
-gt int -gt int - Funkcijai plus vienmer vajag uzreiz abus
argumentus, bet funkcija add var argumentus
apstradat secigi, vienu pec otra. - Ja funkcija add pielietota vienam argumentam,
rezultats joprojam funkcija, kas gatava pienemt
otru argumentu. - Curry - Howard izomorfisms (abi veidi ir
vienlidz iespejami) - - fun curry f x y f (x,y)
- gt val curry fn (a b -gt c) -gt (a -gt b
-gt c) - - fun uncurry f (x,y) f x y
- gt val uncurry fn (a -gt b -gt c) -gt (a b
-gt c) - - val add curry plus Šada ir alternativa
iespejama definicija funkcijai add. - Piezime tipu informaciju ML vide bija spejiga
generet automatiski.
21Saraksti valoda ML
- - nil sinonims ar - , tukšais sarakstsgt
val it a list - - 3 saraksta konstruktors elementa
pievienošana sarakstamgt val it 3 int list - - 5 3 vel viena elementa pievienošanagt
val it 5,3 int list rezultats izteikts
saraksta saisinataja forma - - val x 11 5,3
- gt val x 11,5,3 int list
- - fun len nil 0 len (a s) len s
1 Funkcijas definicija, izmantojot šablonu
atbilstibugt val len fn a list -gt int - - fun len nil 0 Var definet ari šadi len
(_ s) len s 1 _ vieta var but jebkads
elements gt val len fn a list -gt int - - fun sumlist nil 0 sumlist (a s) a
sumlist sgt val sumlist fn int list -gt int
22Saraksti valoda ML turpinats
- Sarakstu apstrade var tikt izmantotas funkcijas
hd un tl, kas pec dota saraksta atdod attiecigi
saraksta pirmo elementu un visu parejo sarakstu
bez pirma elementa. Varam definet - fun hd (a_)a gt val hd fn a list -gt a
- Sistema izdos ari bridinajumu Match not
exhaustive - Izpildes laika, ja meginas izpildit hd
izpildes laika kluda - Labaka definicija izmantot iznemuma situacijas
- - exception hd and tl gt exception hd gt
exception tl - - fun hd nil raise hd hd (a_)a gt val hd
fn a list -gt a - - fun tl nil raise tl tl (_s)s gt val tl
fn a list -gt a list - gt hd nil ( Failure hd )
23Saraksti valoda ML append un reverse
- fun append nil l l append (ht) l h
(append t l) - append 1,2,3 4,5 -gt 1 append 2,3 4,5
-gt1 (2 append 3 4,5) -gt1 (2 (3
append 4,5) -gt1 (2 (3 4,5) ?
1,2,3,4,5 - fun reverse nil nil reverse (ht) append
(reverse t) h - reverse 1,2,3,4 -gtappend (reverse 2,3,4) 1
-gtappend (append (reverse 3,4) 2) 1
-gtappend (append (append (reverse 4) 3) 2)
1 -gtappend (append (append (append (reverse
)4)3)2) 1 -gtappend (append (append
(append 4) 3) 2) 1 -gtappend (append
(append 4 3) 2) 1 -gt -gtappend (append
4,3 2) 1 -gt -gt append 4,3,2 1 -gt
-gt 4,3,2,1 Kvadratiska sarežgitiba - fun rev2 (nil,acc) (nil,acc) rev2
((ht),acc) rev2 (t,(hacc)) Labaks! - fun rev1 x snd(rev2(x,nil)) Darbojas
lineara laika
24Saraksti valoda ML talaki piemeri
- fun listgen 0 0 listgen n n listgen
(n-1) Testa piemeru iegušana - fun map f nil nil map f (ht) (f h)
(map f t) - map funkcija pielieto argumenta funkciju f
katram argumenta saraksta elementam - - map sq 1,2,3,4gt val 1,4,9,16 int list
- fun reduce f nil a a reduce f (ht) a
reduce f t (f h a) - reduce atkartoti izpilda divargumentu funkciju
f, sakot no vertibas a, pec kartas ar f
piesaistot visus saraksta elementus. - fun add x y x y
- fun mult x y x y
- fun addelems xlist reduce add xlist
0 Funkcijas addelems definicija - addelems 1,2,3,4 -gt 10
- fun multelems xlist reduce mult xlist 1
25Saraksti valoda ML talaki piemeri (2)
- fun reduce f nil a a reduce f (ht) a
reduce f t (f h a) - fun add x y x y
- fun mult x y x y
- fun addelems xlist reduce add xlist
0 Funkcijas addelems definicija - addelems 1,2,3,4 -gt 10
- Alternativa funkcijas reduce definicija (cita
argumentu seciba) - fun reduce1 f a nil a reduce1 f a (ht)
reduce1 f (f h a) t - Varam definet funkcijas addelems, multelems ka
vertibas val addelems reduce1 add 0 val
multelems reduce1 mult 1
26Saraksti valoda ML kartošana
- Kartošana, izmantojot ievietošanu (insertion
sort) - fun insert x nil x
- insert x (ht) if x lt h then (x(ht))
else (h(insert x t)) - fun insert_sort nil nil
- insert_sort (ht) insert h (insert_sort t)
- Visa programma izveidota 4 rindinas.
- Vai C var uzrakstit tik vienkaršu kartošanas
programmu? - Darbojas laika, kas proporcionals n2.
27Saraksti valoda ML merge sort
- Kartošana, izmantojot saliešanu (merge sort)
- fun merge nil x x merge x nil x
- merge (a al) (b bl)
- if a lt b then (a (merge al (b bl))) else
(b (merge (aal) bl)) - fun split nil (nil, nil) split (h nil)
(h, nil) - split (h (g ls)) let val (a,b) split
ls in (h a, g b) end - fun merge_sort nil nil merge_sort a a
- merge_sort x let val (e,f) split x val
a merge_sort e val b merge_sort f in merge a
b end - Ieverojam šablonu atbilstibas izmantošanu
lokalajas deklaracijas let izteiksmes funkciju
split un merge_sort definicija. - Darbojas laika n log n.
- Testa piemeri merge_sort (listgenx 10000),
insert_sort (listgenx 10000) - fun x_next n (n 17) mod 1000
- fun listgenx 0 0 listgenx n let val a
listgenx (n-1) in (x_next (hd a)) a end
28Konstruktivie (induktivie) datu tipi
- datatype color red green blue yellow
- fun rotate red green rotate green blue
rotate blue yellow rotate yellow red - datatype btree leaf of int i_vertex of btree
int btree - fun listel (leaf (x)) x
- listel (i_vertex (t1,a,t2)) (listel t1) _at_ (a
(listel t2)) - val t_1 i_vertex(i_vertex(leaf(3),4,leaf(5)),17,
leaf(13)) - val t_2 i_vertex(t_1,15,t_1)
- listel t_1 ( 3,4,5,17,13 )
- listel t_2 ( ??? )
- datatype btl ll of int list ii of btl btl
int list - fun conlists ???
- fun count11 ???
29Konstruktivie (induktivie) datu tipi (turpinats)
- Binarais koks ar 0, 1 vai 2 berniem, katra lapa
vai iekšeja virsotne pa 2 vardiem - datatype b_s l_s of string string v1_s
of b_s string string v2_s of b_s b_s
string string - Ja vardi tikai lapas (analogiski ari ar citiem
objektiem) - datatype b_sl ll_s of string string
vv1_s of b_sl vv2_s of b_sl b_sl - Binars koks, kas var but ari tukšs
- datatype bb_t empty node of bb_t bb_t
int - val my_tree node (node (empty, node (empty,
empty, 3), 11), node (empty, empty,7), 13)
30Valodas IMP interpretators izteiksmes
- (fun fst(x,y) x fun snd(x,y) y)
- datatype aexp acon of int var of string
plus of aexp aexp minus of aexp aexp
times of aexp aexp - datatype bexp bcon of bool eq of aexp aexp
ge of aexp aexp not_b of bexp and_b of
bexp bexp or_b of bexp bexp - fun aval (acon(x)) s x aval (var(v)) s s v
aval (plus(a, b)) s (aval a s) (aval b s)
aval (minus(a, b)) s (aval a s) - (aval b s)
aval (times(a, b)) s (aval a s) (aval b s) - fun bval (bcon x) s x bval (eq (a,b)) s
(aval a s aval b s ) bval (ge (a,b)) s
(aval a s gt aval b s ) bval (not_b(b)) s not
( bval b s ) bval (and_b(b1,b2)) s (bval b1
s) andalso (bval b2 s) bval (or_b(b1,b2)) s
(bval b1 s) orelse (bval b2 s)
31Valodas IMP interpretators
- datatype com skip assign of string aexp
seq of comcom if_c of bexp com com
while_c of bexp com - fun do_assign x a s y if xy then (aval a s)
else (s y) - gt val do_assign fn string -gt aexp -gt
(string -gt int) -gt (string -gt int) - fun eval (skip) s s eval (assign(x,a)) s
do_assign x a s eval (seq(c1,c2)) s eval c2
(eval c1 s) eval (if_c(b,c1,c2)) s if (bval b
s) then (eval c1 s) else (eval c2 s)
eval (while_c(b,c)) s if (bval b s) then
(eval (while_c(b,c)) (eval c s)) else s - gt val eval fn com -gt (string -gt int) -gt
(string -gt int) - Ka nokodet piemeros string -gt int ?
32Valodas IMP interpretators prezentacija
- fun mk_state nil x 0
- mk_state ((v,val)t) x if vx then val else
mk_state t x - gt val mk_state fn ('a int) list -gt 'a -gt
int - val sigma mk_state ("x",14),("y",21)gt val
sigma fn string -gt int - fun show_value s x (x,s(x))
- fun show_state s l map (show_value s) l
- show_value sigma "x"gt val it ("x",14) string
int - show_state sigma "x","y","z"gt val it
("x",14),("y",21),("z",0) (string int) list - fun run c s show_state (eval c (mk_state s))
(map fst s) - gt val run fn com -gt (string int) list -gt
(string int) list - eval analogs, darbojas uz stavokliem ka paru
(mainigais, vertiba) sarakstiem
33Valodas IMP interpretators rezultati
- fun run c l show_state (eval c (mk_state l))
(map fst l) - gt val run fn com -gt (string int) list -gt
(string int) list - val gcd_program let val ax var("x") val ay
var("y") - val b1 not_b(eq(ax,ay)) val b2 ge(ax,ay)
- val c1 assign("x",minus(ax,ay))
- val c2 assign("y",minus(ay,ax))
- val c3 if_c(b2,c1,c2) in while_c(b1,c3) end
- gt val gcd_program com
- run gcd_program ("x",14),("y",35)
- gt val it ("x",7),("y",7) (string int)
list
34Operatori valoda ML
- Funkcijas valoda ML var nemt argumentus pec
kartas, var prasit visus argumentus reize. - (funkcijas, kas prasa visus argumentus pec reize
var tikt uzskatitas par viena argumenta
funkcijam). - Operatori infiksa notacija atteloti simboli,
apzime funkcijas, kas prasa visus argumentus
reize. - Operatoru piemeri
- gt op val it fn int int -gt int
- gt op val it a a list -gt a list
- gt op _at_ Sarakstu konkatenacija. val it a
list a list -gt a list - Pastav ari iespejas lietotajam definet jaunus
operatorus.