Funkcionālā programmēšana (DIP330)

Preview:

DESCRIPTION

Funkcionālā programmēšana (DIP330). Funkcionālā programmēšana. Asociētais profesors, Dr.sc.ing. Vjačeslavs Šitikovs Rīgas Tehniskā universitāte Datorzinātnes un informācijas tehnoloģijas fakultāte Lietišķo datorsistēmu institūts Lietišķo datorsistēmu programmatūras profesora grupa. - PowerPoint PPT Presentation

Citation preview

Lekciju materiāls sagatavots projekta“RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana” ietvaros

©RTU, 2006

Funkcionālā Funkcionālā programmēšana (DIP330)programmēšana (DIP330)

2RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcionālā programmēšanaFunkcionālā programmēšana

Asociētais profesors, Dr.sc.ing. Vjačeslavs Šitikovs

Rīgas Tehniskā universitāteDatorzinātnes un informācijas tehnoloģijas fakultāteLietišķo datorsistēmu institūtsLietišķo datorsistēmu programmatūras profesora grupa

3RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Priekšmeta pamatdatiPriekšmeta pamatdati

• Priekšmeta pieteicējs: Vjačeslavs Šitikovs• Apjoms: 2 KP• Kontroles veids: Eksāmens; Studiju darbs• Studiju līmenis: Akadēmiskā bakalaura

studiju programma• Semestris: 5. semestris

4RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Priekšmeta mērķi un uzdevumiPriekšmeta mērķi un uzdevumi

• Mērķi:– Funkcionāla pieeja algoritmu izstrādei. Rekursīva pieeja funkciju

aprakstam. Problēmu risināšana sakot no gaidāma rezultāta. Programmatūras rīku izvēle specifiskas problēmas risināšanai.

• Uzdevumi:– Apgūt konkrēto funkcionālas programmēšanas valodas LISP

pamatus sagatavot pirmo nesarežģīto programmu (sarakstu apstrāde).

– Apgūt valodas LISP realizācijas LispWorks pamatus praktiski, izpildot pirmo programmu. Mērījums – strādājoša programma un atskaite.

– Apgūt daudzlīmeņu sarakstu rekursīvo apstrādi. Mērījums – strādājoša programma un atskaite.

– Apgūt sarežģīto problēmu risināšanu, kurai vispiemērotākā ir funkcionāla rekursīva pieeja. Mērījums – atskaite par studijas darbu, tas aizstāvēšana un atzīme.

5RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PamatliteratūraPamatliteratūra

• Šitikovs V. “Programmēšanas valoda LISP. Lekciju konspekts“ // RTU, 2002, 36 lpp.– Valodas LISP īss apraksts ar piemēriem un

paskaidrojumiem.

• Šitikovs V. “Programmēšanas valoda LISP. Lekciju konspekts“ // RTU, 2002 / Internet - http://www.cs.rtu.lv/PubsLoc/Sitikovs /saturs.htm– Valodas LISP īsa apraksta Internet-versija ar

piemēriem un paskaidrojumiem.

6RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PapildliteratūraPapildliteratūra

• Маурер У. Введение в программирование на языке ЛИСП. – М.: Мир, 1976. – 104.– Valodas LISP īss apraksts ar piemēriem un paskaidrojumiem

krievu valodā.

• Graham P. “On Lisp. Advanced Techniques for Common Lisp”// Prentice Hall, 1993, 432 pages (free download from http://www.paulgraham.com/onlisptext.html).– Valodas LISP detalizēts apraksts.

• Schwarz M. „LISP Tutorial“ / Internet. - http://cs1.cs.nyu.edu/phd_students/schwarz/NLCP/lisp.html– Valodas LISP detalizēta apraksta interaktīva versija.

7RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Atslēgas vārdiAtslēgas vārdi

• Nealgoritmiska programmēšanas valoda

• Funkciju valoda• Sarakstu apstrādāšana• Rekursija• Rekursīvas funkcijas• Funkciju noteikšana• Nealgoritmiskās un algoritmiskās

pieejas kombinācija

8RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Pamattēmas (1)Pamattēmas (1)

• Ievads. Valodas apraksts – alfabēts, pamatkonstrukcijas (atomi, saraksti, izteiksmes, apakšsaraksti).

• Rekursija. Tieša un netieša rekursija. Cikliskas un rekursīvas pieejas salīdzinājums.

• Funkciju izveidošana – sintakse, semantika, pieejas, paņēmieni, parametri.

• Funkcijas sarakstu apstrādei. Ievade-izvade. Interaktīvas funkcijas

• Predikāti un to pielietošana sarakstu apstrādei.• Nosacījuma izteiksmes, nosacījuma funkcijas.• Rekursīvas funkcijas – sarakstu rekursīvā apstrāde,

apakšsaraksti un rekursija, rekursīvie predikāti.

9RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Pamattēmas (2)Pamattēmas (2)

• Loģiskie operatori un to pielietošana sarakstu apstrādei.• Rekursīvās funkcijas no diviem sarakstiem.• Funkcijas tipu izzināšanai. Argumentu validācija.• PROG-izteiksmes – apraksti, operatori, iezīmes, vadības

nodošana, nosacījuma izteiksmes, vērtības atgriešana. PROG- izteiksmes sarakstu apstrādei, sarakstu veidošana.

• Funkcijas darbība.• Predikāti, kuri uzrakstīti ar PROG palīdzību.• Rekursija PROG-izteiksmēs.• Funkciju apvienošana.• Izskaitļošanas noteikums, izskaitļojoša funkcija.• Programma kā dati.

10RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (1)Ievads (1)

• Visu programmēšanas valodu kopu var sadalīt:– algoritmiskās jeb imperatīvās (instrukciju

valodās) – nealgoritmiskās

• Algoritmiskās– norādīta nepieciešamā darbību secība

– universālas programmēšanas valodas• Pascal, C, Basic u.t.t.

11RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (2)Ievads (2)

• Speciālu uzdevumu risināšanā– GPSS - vispārējas apkalpošanas

sistēmu modelēšanai– PROLOG - teorēmu pierādījuma tipa

uzdevumiem– LISP - dialoga realizēšanai valodā,

kura ir tuva dabīgai valodai

12RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (3)Ievads (3)

• LISP– saīsinājums no LISt Processing -

sarakstu apstrādāšana– nealgoritmiska programmēšanas

valoda– funkcionāla programmēšanas valoda

13RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (4)Ievads (4)

Imperatīva valoda

Input (a,b)c := a + bPrint (c)

Sākums -> Vidus-> Nobeigums

Funkcionāla valoda

Print (Plus Input() Input() )

Nobeigums ( Vidus (Sākums) )

14RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (5)Ievads (5)

• LISP– Džona Maikarta vadībā– Masačūsetas tehnoloģiskajā institūtā– 1960.gadā– lai aprakstītu simbolisko izteiksmju

rekursīvās funkcijas

15RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (6)Ievads (6)

• LISP– funkciju valoda– katra konstrukcija, kura ir uzrakstīta

valodā LISP, tiek apskatīta kā funkcija•(A B C) ir A(B,C)•sin x

– algoritmiskā valodās izskatās kā sin(x)– valodā LISP kā (sin x)

16RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (7)Ievads (7)

• Valodā LISP izņēmumu nav– x + y

•tiek pierakstīts kā (+ x y)

• Par funkcijas argumentu var būt citas funkcijas rezultāts– (A+B)*(C+D)

• tiek pierakstīts kā (*(+ A B)(+ C D))

17RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (1)Valodas apraksts (1)

• Alfabēts– burti– cipari– ierobežotāji

•( - kreisā apaļā iekava•) - labā apaļā iekava•_ - intervāls

• Litera - drukāta zīme no alfabēta

18RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (2)Valodas apraksts (2)

• Atoms – patvaļīga literu secība, kura atrodas

starp diviem ierobežotājiem un pie kuras nepieder paši ierobežotāji

– konstrukcijā (A(ATOM X24)-ABC(-10 2.5)) atomi ir• A ATOM X24 -ABC -10 2.5

19RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (3)Valodas apraksts (3)

• Atomi– konstantes– identifikatori

•mainīgie•funkciju vārdi•jāsākas ar burtu un tam jāsastāv tikai no

burtiem un cipariem•nav ierobežojumu mainīgā vārda

garumam

20RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (4)Valodas apraksts (4)

• Rezervēti identifikatori– T - patiess (true),– F - nepatiess (false),– NIL - tukšums, kurš bieži tiek lietots

“nepatiess” vietā

21RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (5)Valodas apraksts (5)

• Mainīgajam var būt vērtība• Viens no vērtību piešķiršanas veidiem

– izmantojot funkciju SETQ •(SETQ X 5) analoģiski X:=5•(SETQ X (+ Y 1)) analoģiski x:=y+1•(SETQ X Y) analoģiski x:=y•(SETQ X (QUOTE Y)) analoģiski x:=“y”

– (SETQ X ‘Y)

22RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (6)Valodas apraksts (6)

• SETQ– netieši tiek izmantota funkcija QUOTE– piešķires funkcija SET

•(SET X Y) nozīme ka vērtībai X tiek piešķita Y vērtība

– Ja X ir vienāds ar 3 un Y ir vienāds ar 6, tad funkcija SET piešķirt skaitlim 3 skaitļa 6 vērtību, kas ir bezjēdzība

– (SET(QUOTE X) Y) vai (SETQ X Y)•piešķir mainīgajam X vērtību 6

23RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (7)Valodas apraksts (7)

• Ja X vērtība ir simbols Z– (SET X Y) ievieto mainīgajā Z

mainīgā Y vērtību•analoģiski z:=y

24RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (8)Valodas apraksts (8)

• Saraksti– elementu secība, kura ietverta apaļās iekavās– saraksta elements - atoms vai saraksts– saraksta elementu atdalītāji – intervāli

• Atdalītājs ir nepieciešams, ja abi saraksta blakus elementi ir atomi.

– Sarakstu piemēri• (A B C D) • (x) ((((100)))) (1(2 3)4)• () - tukšs saraksts

25RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (9)Valodas apraksts (9)

• Izteiksme ir atoms vai saraksts– Dažām izteiksmēm var būt vērtības

•Izteiksmes vērtība arī var būt izteiksme– Izteiksmes, kurām var būt vērtība

•konstantes, mainīgie•saraksti

– griešanās pie funkcijām» (P Q R) ir funkcijas P vērtība no

argumentiem Q un R» (G) - funkcija bez argumentiem

26RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (10)Valodas apraksts (10)

• Ir tikai viens konstrukcijas veids, kas tiek izskatīts valodā LISP – tās ir funkcijas

• Pārējie valodas LISP līdzekļi, tādi kā:– jaunu funkciju noteikšana– nosacījuma un beznosacījuma vadības

nodošana u.t.t.– tiek noteikti ar speciālu funkciju

palīdzību

27RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (11)Valodas apraksts (11)

• Funkcija QUOTE– Funkcija QUOTE ir vienīgā, kura

neatbilst noteikumam, ka pirmais saraksta elements ir funkcijas vārds, bet pārējie saraksta elementi ir tās funkcijas argumenti

– (QUOTE(saraksts)) vērtība ir pats saraksts

28RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (12)Valodas apraksts (12)

• (SETQ X (1 2 3)) ir bezjēdzīga– nozīmē: "mainīgajam x piešķirt funkcijas 1

vērtību ar argumentiem 2 un 3

• (SETQ X (QUOTE (1 2 3)))– mainīgajam X ir piešķirta saraksta vērtība– saīsināti (SETQ X ‘(1 2 3))

• funkcijas LIST vērtība ir tās argumentu saraksts– (LIST 1 2 3) vērtība ir (1 2 3)

29RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (13)Valodas apraksts (13)

• Ja mainīgajam x ir piešķirta vērtība 2– (LIST 1 x 3 x) vērtība ir (1 2 3 2)– (QUOTE(1 x 3 x)) vērtība ir (1 x 3 x)

• Par daudzu funkciju vērtību var būt saraksts– (DIVIDE 65 3) vērtība ir (21 2), kur

•21 - veselā daļa un 2 - dalījuma atlikums

30RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (14)Valodas apraksts (14)

• Ja par funkcijas argumentu jābūt atomam un šī argumenta vietā ir saraksts kaut arī no viena elementa, tas noved pie kļūdas. Piemēram,– (SETQ X (LIST 3))– (SETQ Y (PLUS X 1)) – kļūda, jo

mainīgajam X būs vērtība (3)

31RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (15)Valodas apraksts (15)

• Apakšsaraksts - saraksts, kurš ietverts citā sarakstā

• ((1 6)7((8 4)3))– (1 6)– 7– ((8 4)3)

•(8 4) •3

32RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

RekursijaRekursija

• Griežas pašas pie sevis– tieši vai arī netieši– griežas pati pie sevis – tieši– A griežas pie B un B pie A – netieši

•Vispārīgā gadījumā ķēdīte var būt garāka

– n! = n * (n-1)!•Pilnīgs noteikums 0! = 1

– izteiksme ir atoms vai (izteiksmju secība)

33RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (1)Funkciju izveidošana (1)

• Parasti funkciju aprakstā ir četras pamatdaļas:– apraksta sākuma pazīme (vārds

FUNCTION, PROCEDURE u.t.t.)– funkcijas vārds– parametru saraksts pēc kārtas– nākošie teikumi, kuri patiesība

nosaka (definē) funkciju

34RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (2)Funkciju izveidošana (2)

• Valodā LISP– DEFUN - funkcija, lai aprakstītu funkciju

•3 argumenti– (DEFUN A (B C) D)

•D ir funkcijas A ar argumentiem B un C apraksts

– (DEFUN A (X Y) (+ X Y))– (DEFUN P (X) (* X X))

•(P 7) rezultāts ir 49

35RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (3)Funkciju izveidošana (3)

• Parametri– formālie

•tiek lietoti funkcijas aprakstam•tikai identifikatori

– faktiskie•lai grieztos pie funkcijas•var būt izteiksmes

36RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (4)Funkciju izveidošana (4)

• F(x,y) = x*x-y*y• (DEFUN F (X Y) (-(* X X) (* Y Y)))

– X un Y - formālie parametri– 4 un 3 – faktiskie parametri– (F 4 3) nozīmē, ka

• X saistās ar 4• Y saistās ar 3• F(4,3) =4*4-3*3=16-9=7

37RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (5)Funkciju izveidošana (5)

• (DEFUN F (X) (- (* X X) (* Y Y)))– funkcijas vērtība ir atkarīga no tā,

kāda vērtība funkcijas izskaitļošanas brīdī būs mainīgajam Y

– X ir saistošs (lokālais) mainīgais– Y ir brīvais (globālais) mainīgais

38RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (1)Funkcijas sarakstu apstrādei (1)

• Trīs primitīvākās – CAR, CDR un CONS

• CAR– arguments ir saraksts– vērtība ir pirmais saraksta elements– Ja x ir (2 6 4 7), tad (CAR x) ir 2– Ja x ir (2 (6 (4 (7)))), tad (CAR x) ir 2– Ja x ir ((2 6)(4 7)), tad (CAR x) ir (2 6)

39RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (2)Funkcijas sarakstu apstrādei (2)

• CAR– Ja x ir ((((2)6)4)7), tad (CAR x) ir (((2)6)4)– Ja x ir atoms, tad (CAR x) novedīs pie

kļūdas– (CAR (1 2 3)) ir bezjēdzīga

• griešanos pie funkcijas 1 no argumentiem 2 un 3

– (CAR (QUOTE (1 2 3))) vērtība ir 1

40RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (3)Funkcijas sarakstu apstrādei (3)

• CDR– arguments ir saraksts– vērtība ir saraksta atlikums bez pirma

elementa– Ja x ir (2 6 4 7), tad (CDR x) ir (6 4 7)– Ja x ir ((2 6)(4 7)), tad (CDR x) ir ((4 7))– Ja x ir ((((2) 6) 4) 7), tad (CDR x) ir (7)

41RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (4)Funkcijas sarakstu apstrādei (4)

• CDR– Ja x ir saraksts ar precīzi vienu elementu,

tad (CDR x) ir NIL, kurš šajā gadījumā apzīmē tukšu sarakstu

– Ja x ir atoms, tad (CDR x) novedīs pie kļūdas

42RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (5)Funkcijas sarakstu apstrādei (5)

•CONS– savāc (savieno) to, ko CAR un CDR ir

sadalījusi daļās– pirmais arguments vienalga kas– otrais arguments obligāti saraksts– Ja x ir 2 un y ir (6 4 7), tad (CONS

x y) ir (2 6 4 7)

43RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (6)Funkcijas sarakstu apstrādei (6)

• CONS– Ja x ir 2 un y ir ((6 (4(7)))), tad (CONS x

y) ir (2 (6 (4 (7))))– Ja x ir (2 6) un y ir ((4 7)), tad (CONS x

y) ir ((2 6)(4 7))– Ja x ir (((2) 6) 4) un y ir (7), tad (CONS x

y) ir ((((2) 6) 4) 7)– (CONS (CAR x) (CDR x)) ir x

44RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (7)Funkcijas sarakstu apstrādei (7)

•CAR un CDR kombinācijas– (CAR (CDR L)) – saraksta L otrais

elements•saīsināti (CADR L)

– (CAR (CDR (CDR L))) – saraksta L trešais elements•saīsināti (CADDR L)

– u.t.t.

45RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (8)Funkcijas sarakstu apstrādei (8)

• Atkarībā no realizācijas D D– C ... R A A

– (CDADDR Y) nozīmē (CDR (CAR (CDR (CDR Y))))

46RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (9)Funkcijas sarakstu apstrādei (9)

•APPEND– savieno savā starpā divus sarakstus– Ja X ir (1 2 3) un Y ir (4 5 6), tad

(APPEND X Y) ir (1 2 3 4 5 6)– (CONS X Y) būtu ((1 2 3) 4 5 6)

47RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (1)Predikāti (1)

• Funkcijas, kuru vērtība (rezultāts) var būt "patiesība" vai "meli“

• Valodā LISP predikātiem ir vērtība– T - patiess vai– NIL - nepatiess

48RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (2)Predikāti (2)

• Funkcija ATOM– arguments ir atoms vai saraksts– ja atoms, tad funkcijas vērtība ir T,

pretējā gadījumā NIL– ja X ir 5, tad (ATOM X) ir T– ja X ir simbols, tad (ATOM X) ir T– ja X ir (1 2 3), tad (ATOM X) ir NIL

49RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (3)Predikāti (3)

• Funkcija NULL– pārbauda vai tās argumenta vērtība nav

NIL– ja X ir 5, tad (NULL X) ir NIL– ja X ir (1 2 3), tad (NULL X) ir NIL– ja X ir NIL, tad (NULL X) ir T – ja X ir saraksts no viena elementa, tad

(NULL X) ir NIL, bet (NULL (CDR X)) ir T

50RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (4)Predikāti (4)

• Funkcija EQUAL– pārbauda vai divu tās argumentu

vērtība ir vienāda– ja X ir (4 6 (8 3)) un Y ir ((4 6) 8 3),

tad (EQUAL X Y) ir NIL– ja X ir (+ 2 2) rezultāts un Y ir 4, tad

(EQUAL X Y) ir T

51RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (5)Predikāti (5)

• Funkcija ZEROP– pārbauda vai tās arguments ir nulle– burts P nosaukumā nozīmē "predicate“– ja arguments ir nulle, tad funkcijas vērtība ir

T, pretējā gadījumā - NIL.

• Funkcija GREATERP vai >– divi argumenti

• Citas funkcijas >= < <= <> u.t.t.

52RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (1)Nosacījuma izteiksmes (1)

• Nosacījuma operatora vietā, kā parasti, ir nosacījuma funkcija

• Funkcija COND– dažos gadījumos varam izlasīt sākot

ar "ja"– (COND ((ZEROP S)(SETQ Y 12)))

•ja S ir nulle, tad piešķirt mainīgajam Y vērtību 12

53RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (2)Nosacījuma izteiksmes (2)

•COND– nenoteikts argumentu skaits– katrs no argumentiem ir pāris

•saraksts no diviem elementiem– pirmais pāra elements ir nosacījums– otrais pāra elements ir lielums vai

darbība– (COND ((> A 65) 10) ((> A 21) 30)

(T 0))

54RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (3)Nosacījuma izteiksmes (3)

• COND– nenoteikts argumentu skaits– katrs no argumentiem ir pāris

• saraksts no diviem elementiem

– pirmais pāra elements ir nosacījums– otrais pāra elements ir lielums vai darbība– (COND ((> A 65) 10) ((> A 21) 30) (T

0))• if A>65 then 10 else if A>21 then 30 else 0

55RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (4)Nosacījuma izteiksmes (4)

• Vispārējā gadījumā– LISP pēc kārtas apskata katru pāri no

pirmā līdz pēdējam– ja nosacījuma vērtība nav T, tiek ņemts

nākošais pāris– ja nosacījuma vērtība ir T, tad LISP

apstājas šajā vietā un par rezultātu ņem dotā pāra otro elementu

– pārbaude ne uz T, bet uz ne NIL

56RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (5)Nosacījuma izteiksmes (5)

• Vispārējā gadījumā– LISP pēc kārtas apskata katru pāri – ja nosacījuma vērtība ir NIL, tiek ņemts nākošais

pāris– ja nosacījuma vērtība kaut kas cits, bet ne NIL,

tad LISP apstājas šajā vietā un par rezultātu ņem dotā pāra otro elementu

– (COND ((CDR L) 2) (T 1)) vērtība būs 2, ja L ir saraksts no vairāk kā viena elementa

– Pēdējais pāris ar T nodrošina, ka nosacījuma izteiksmei vienmēr ir vērtība (else sastāvdaļa)

57RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvas funkcijas (1)Rekursīvas funkcijas (1)

• faktoriāla rekursīvais nosacījums:– 0! = 1;– n! = n*(n-1)!

• Algoritmiskā valodā:integer procedure fact(n);integer n;fact:=if n =0 then 1 else n x fact (n-1);end

58RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvas funkcijas (2)Rekursīvas funkcijas (2)

• Valodā LISP(DEFUN FACT (N) (COND ((ZEROP N) 1) (T (* N (FACT (- N

1)))) ))

59RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Sarakstu rekursīvā apstrāde (1)Sarakstu rekursīvā apstrāde (1)

• Noteiksim funkciju ADD– saskaita visus saraksta elementus

• ja L ir (1 2 3 4 5), tad (ADD L) ir 15

(DEFUN ADD (L) (COND((NULL L) 0)(T (+ (CAR L)(ADD (CDR L))))) )

60RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Sarakstu rekursīvā apstrāde (2)Sarakstu rekursīvā apstrāde (2)

• Līdzīgā veidā var noteikt funkciju MULT– saraksta skaitļu reizinājums

• ja L ir (1 2 3 4 5), tad (MULT L) ir 120

(DEFUN MULT (L) (COND((NULL L) 1)(T (* (CAR L)(MULT (CDR L))))) )

61RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Apakšsaraksti un rekursija (1)Apakšsaraksti un rekursija (1)

• Funkcija ADD strādā nepareizi, ja saraksts L satur apakšsarakstus– funkcijas PLUS argumenti var būt

tikai atomi• Noteiksim funkciju ADD2

– saskaita visus saraksta un to apakšsarakstu elementus•ja L ir (1 (2 (3 4)) 5), tad (ADD2 L) ir 15

62RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Apakšsaraksti un rekursija (2)Apakšsaraksti un rekursija (2)

(DEFUN ADD2 (L) (COND((NULL L) 0)((ATOM (CAR L)) (+ (CAR L) (ADD2 (CDR L))))(T (+ (ADD2 (CAR L)) (ADD2 (CDR

L))))) )(ADD2 ‘(3 ((8 4) 7 (5 6))))

63RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

IzvadeIzvade

• Galarezultāts (visaugstākā līmeņa funkcijas rezultāts) ir izvests automātiski

• Starprezultāts– Funkcija PRINT– Neierobežots argumentu skaits– (PRINT 2 3 (+ 2 3))

2 3 5

64RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievade (1)Ievade (1)

• Funkcija INPUT– bez argumentiem– vērtība ir rinda līdz – (+ INPUT() INPUT() )>2>35>

65RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievade (2)Ievade (2)

• Funkcija INPUT>(CAR INPUT() )>(2 3)Error!>(CAR INPUT() )>’(2 3)2>

66RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvie predikāti (1)Rekursīvie predikāti (1)

• COND– pāru otrais elements

• T vai NIL

• Funkcija MEMBER – divi argumenti:

• atoms X• saraksts L

– ja X ir L sastāvdaļa, tad (MEMBER X L) ir T, pretējā gadījumā NIL

67RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvie predikāti (2)Rekursīvie predikāti (2)

(DEFUN MEMBER (X L) (COND((NULL L) NIL)((EQUAL X (CAR L) T)(T (MEMBER X (CDR L))) ))

(MEMBER ? ?)

68RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (1)Loģiskie operatori (1)

• “Loģiskais UN" (konjunkcija)• “Loģiskais VAI" (disjunkcija)• Noliegums (inversija)• Funkcija NOT

– viens arguments– vērtība ir T, ja par argumentu kalpo NIL, un

NIL, ja par argumentu kalpo kaut kas atšķirīgs no NIL• Faktiski tā dara to pašu, ko funkcija NULL

69RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (2)Loģiskie operatori (2)

• Funkcija AND– nenoteikts argumentu skaits– vērtība vienmēr būs NIL, ja kaut viens arguments

vienāds ar NIL– pretējā gadījumā vērtība būs T

• Funkcija OR– nenoteikts argumentu skaits– vērtība vienmēr būs T, ja kaut viens arguments

nav vienāds ar NIL– pretējā gadījumā vērtība būs NIL

70RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (3)Loģiskie operatori (3)

• Noteiksim funkciju MEM2– saistīta ar MEMBER tieši tāpat, kā

ADD2 ar ADD– pārbaudīs

•vai pirmais arguments nav kāda saraksta loceklis

•vai kāda tā apakšsaraksta loceklis•vai kāda tā apakšsaraksta apakšsaraksta

loceklis•un tā tālāk

71RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (4)Loģiskie operatori (4)

(DEFUN MEM2 (X L) (COND ((NULL L) NIL) (T (OR (COND ((ATOM (CAR L))

(EQUAL X (CAR L)))

(T (MEM2 X (CAR L))) ) (MEM2 X (CDR L))) ) )

72RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvās funkcijasRekursīvās funkcijasno diviem sarakstiem (1)no diviem sarakstiem (1)

• Kā tiek noteikta funkcija APPEND– apvieno divus sarakstus(DEFUN APPEND (L M) (COND((NULL L) M)(T (CONS (CAR L) (APPEND (CDR L)

M ) ))) )

(APPEND L M ) ja L ir (1 2 3) un M ir (4 5 6)

73RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvās funkcijasRekursīvās funkcijasno diviem sarakstiem (2)no diviem sarakstiem (2)

• Noteiksim funkciju EQUAL– argumenti var būt saraksti ar

apakšsarakstiem – ar funkcijas EQ palīdzību

• argumenti tikai atomi

– saraksti L un M ir vienādi, ja• vienādi ir to pirmie elementi (CAR L) un (CAR M)• un vienādas arī atlikušās sarakstu daļas (CDR L)

un (CDR M)• jābūt vienādiem abiem šiem pāriem

74RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvās funkcijasRekursīvās funkcijasno diviem sarakstiem (3)no diviem sarakstiem (3)

(DEFUN EQUAL (L M) (COND((NULL L) NULL M))((ATOM L) (AND (ATOM M) (EQ L M)))((ATOM M) NIL)(T (AND (EQUAL (CAR L) (CAR M)) (EQUAL (CDR L) (CDR M))) )) )

75RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (1)Funkcijas tipu izzināšanai (1)

• Predikāts NUMBERP– viens arguments– predikāta vērtība ir T, ja argumentam ir

skaitliska vērtība– ja X ir 5, tad (NUMBERP X) ir T– ja X ir simboli ABC, tad (NUMBERP X) ir

NIL– ja X ir (1 2 3), tad (NUMBERP X) ir NIL

76RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (2)Funkcijas tipu izzināšanai (2)

• Funkcijas FIXP un FLOATP– viens arguments– FIXP vērtība ir T, ja arguments ir skaitlis ar

fiksētu punktu– FLOATP vērtība ir T, ja arguments ir

skaitlis ar peldošu punktu– ja X ir 7, tad (FIXP X) ir T, bet (FLOATP

X) ir NIL– ja X ir 7.5, tad (FIXP X) ir NIL, bet

(FLOATP X) ir T

77RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (3)Funkcijas tipu izzināšanai (3)

• Noteiksim funkciju COUNTFIXFLOAT– funkcijas arguments ir saraksts L– funkcijas vērtība būs saraksts no diviem

elementiem• pirmais elements – ciparu skaits formā ar

fiksētu punktu• otrais - ciparu skaits ar peldošu punktu

– ja X ir (T LAM 5.6 3(8((9.1 4.122 J)B 6 3.1 R)), tad

– (COUNTFIXFLOAT X) ir (3 4)

78RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (4)Funkcijas tipu izzināšanai (4)

(DEFUN COUNTFIXFLOAT (L) (COND((NULL L) (QUOTE (0 0)))((ATOM L) (COND ((FIXP L) (QUOTE (1 0))) ((FLOATP L) (QUOTE (0

1))) (T (QUOTE (0 0))) )(T (SUM2 (COUNTFIXFLOAT (CAR L)) (COUNTFIXFLOAT (CDR L))) ) ))

79RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (5)Funkcijas tipu izzināšanai (5)

(DEFUN SUM2 (L M)(CONS (+ (CAR L) (CAR M)) (LIST (+ (CADR L) (CADR M)))))

ja X ir (4 3), bet Y ir (7 2), tad(SUM2 X Y) ir (11 5)

80RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (1)PROG-izteiksmes (1)

• Secīgu operatoru veids• Pārveido funkcionālo pierakstu uz

nefunkcionālo pierakstu– realizē algoritmiskās valodās jēdzienus:

• apraksti• operatori• iezīmes• vadības nodošana• nosacījuma izteiksmes• vērtību atgriešana

81RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (2)PROG-izteiksmes (2)

• Apraksti– pirmais funkcijas PROG arguments

• mainīgo saraksts, kuri tiks izmantoti dotajā PROG

– parametri netiek ieslēgti šajā sarakstā– mainīgā tips netiek noteikts

• atkarīgs no piešķirtas vērtības

– mainīgo vērtībām jābūt noteiktām, līdz to lietošanas momentam

– mainīgie var būt saraksti• var izmantot masīvu vietā

82RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (3)PROG-izteiksmes (3)

• Operatori– piešķirta PROG argumentu loma– SETQ un SET tipa izteiksmes

• Iezīmes– piešķirta PROG argumentu loma– vienmēr atsevišķs atoms

•atšķiras no griešanās pie funkcijām

83RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (4)PROG-izteiksmes (4)

• Ir trīs tipu PROG argumenti:– pirmais arguments

•PROG-mainīgo saraksts

– operatori•lai grieztos pie funkcijām

– Iezīmes

• Argumentu skaits ir neierobežots

84RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (5)PROG-izteiksmes (5)

• Vadības nodošana– operators GO– vienīgais arguments ir iezīme– (GO SIGMA)

•nozīmē vadības nodošanu uz iezīmi SIGMA

•operatoram, kurš seko tūlīt pēc šīs iezīmes

85RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (6)PROG-izteiksmes (6)

• Nosacījuma izteiksmes– funkcija COND– divas atšķirības no izmantošanas funkcijās

• pāra otrais elements nav lielums, bet ir operators– jebkura tipa

• pēdējam pārim nav obligāti jāsākas ar T– Tas ir analoģiski operatoram IF-THEN bez ELSE daļas

• Vērtības atgriešana– funkcija RETURN– viens arguments– PROG-izteiksmes vērtība

86RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

FaktoriālsFaktoriāls

• Variants algoritmiska valodā:INTEGER FUNCTION FACT(N)I=NJ=1

1 IF (I .EQ. 0) GOTO 2J=J*II=I-1GOTO 1

2 FACT=JRETURNEND

87RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-faktoriālsPROG-faktoriāls

• Variants valodā LISP:(DEFUN FACT (N) (PROG (I J)(SETQ I N) (SET J 1)K (COND ((ZEROP I) (GO L)))(SETQ J (* J I))(SETQ I (- I 1))(GO K)L (RETURN J) ))

88RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu apstrāde (1)PROG. Sarakstu apstrāde (1)

• Tas nav saraksts, bet gan drīzāk viendimensijas masīvs

• Indekss– mainās ar vieninieku, lai pārietu uz nākošo

masīva elementu• funkcija CDR izsvītro pirmo saraksta elementu

– algoritmiskā valodā:S=0DO 1 I=1,100

1 S=S+A(I)

89RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu apstrāde (2)PROG. Sarakstu apstrāde (2)

• Pārrakstīsim funkciju ADD, izmantojot PROG-izteiksmes

(DEFUN ADD (L) (PROG (M N)(SETQ M L) (SETQ N 0)A (COND ((NULL M) (RETURN N)))(SETQ N (+ N (CAR M)))(SETQ M (CDR M)) (GO A) ))• Nav tik efektīva un “caurspīdīga” kā

rekursīvā

90RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu veidošana (1)PROG. Sarakstu veidošana (1)

• Pats efektīvākais saraksta apstrādes veids– apstrāde no sākuma– CAR un CDR

• Veidot sarakstu visefektīvāk no beigām– pēdējo elementu jāizskaitļo pirmo– jauni elementi jāpievieno saraksta sākumā– pirmo saraksta elementu jāizskaitļo pēdējo– CONS

91RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu veidošana (2)PROG. Sarakstu veidošana (2)

• Noteiksim programmu REVERSE– pārraksta sarakstu apgrieztā kartībā

(DEFUN REVERSE (L) (PROG (M P)(SETQ M L) (SETQ P NIL)A(COND (( NULL M) (RETURN P)))(SETQ P (CONS (CAR M) P))(SETQ M (CDR M)) (GO A) ))

92RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu veidošana (3)PROG. Sarakstu veidošana (3)

• Izveidošana it kā no sākuma• Noteiksim funkciju DOUBLE

– dubulto katru veselu skaitli no veselu skaitļu saraksta

(DEFUN DOUBLE (X) (COND ((NULL X) X)(T (CONS (+ (CAR X)(CAR X))

(DOUBLE (CDR X))) ) ) )

93RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas darbība (1)Funkcijas darbība (1)

• Divdimensiju masīvs - sarakstu saraksts– vieninieku matrica δij NxN,

•δij = 1, ja i=j un•δij = 0, ja i nav = j,•kur 1<= i, j <=N

– N=4 • ( (1 0 0 0) (0 1 0 0) (0 0 1 0) (0 0 0

1) )

94RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas darbība (2)Funkcijas darbība (2)

• Noteiksim funkciju UNITMATR– (UNITMATR N) rezultāts ir vieninieku

masīvs NxN(DEFUN UNITMATR (N) (PROG (I J K L

Z)I - matricas rindas kārtas numursJ - matricas stabiņa kārtas numursK - saraksts, kurš atbilst tekošai rindaiL - rezultējošā matricaZ - tekošais matricas rindas elements

95RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas darbība (3)Funkcijas darbība (3)

(SETQ I N) (SETQ L NIL)A (SETQ J N) (SETQ K NIL)B (COND ((EQUAL I J)(SETQ Z 1))

(T (SETQ Z 0)) )(SETQ K (CONS Z K)) (SETQ J (- J 1))(COND ((> J 0)(GO B)))(SETQ L (CONS K L) (SETQ I (- I 1))(COND ((> I 0)(GO A)))(RETURN L) ))

96RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programmas saīsināšanaProgrammas saīsināšana

• Izmantot funkciju vienlaicīgi gan darbību izpildei, gan vērtības iegūšanai– nomainīt divus operatorus

(SETQ J (- J 1)) (COND ((> J 0) (GO B)))

– uz vienu operatoru(COND ((> (SETQ J (- J 1)) 0) (GO B)))• atņemt 1 no vērtības J• iegūt jaunu J vērtību• pārbaudīt jaunu J vērtību

97RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Predikāti (1)PROG. Predikāti (1)

• Jāatgriež T vienā vietā un NIL citā– pie kam var būt vairāki RETURN operatori

vienā PROG- izteiksmē• Piemērs

– Predikāta arguments ir saraksts, kurš attēlo spēļu kārtis

– Katra kārts tiek attēlota ar sarakstu, sastāvošu no diviem elementiem• masts• lielums• (Pīķa dūzis) (Kārava 10) (Kreiča 5)

98RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Predikāti (2)PROG. Predikāti (2)

• Noteiksim funkciju PIKUNAV(DEFUN PIKUNAV (L) (PROG (M P)

(SETQ M L)A (COND ((NULL M) (RETURN T))) (SETQ P (CAR M)) (SETQ M (CDR

M)) (COND ((EQUAL (CAR P) ‘Pīķa)

(RETURN NIL))) (GO A) ))

99RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

RekursijaRekursija

• PIKUNAV funkcionālā veida(DEFUN PIKUNAV (L) (COND((NULL L) T)(T (AND (NOT (EQUAL (CAAR L) ‘Pīķa)) (PIKUNAV (CDR L))) )) )

100RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Predikāti (3)PROG. Predikāti (3)

(DEFUN ERCENU_VAIRĀK_KĀ_PĪKU (L) (PROG ( M P X Y) ;X,Y - ercenu pīķu skaits

(SETQ M L) (SETQ X 0) (SETQ Y 0)A (COND ((NULL M) (RETURN (> X Y))))

(SETQ P (CAR M)) (SETQ M (CDR M))(COND ((EQUAL (CAR P) ‘Ercena)

(SETQ X (+ X 1)) ) ((EQUAL (CAR P) ‘Pīķa )

(SETQ Y (+ Y 1)) ) )(GO A) ))

101RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

RekursijaRekursija

• Funkcionālā veida(DEFUN ERCENU_VAIRĀK_KĀ_PĪKU (L)(> (PIKI L) (ERCENI L)) )(DEFUN PIKI (L) (COND((NULL L) 0)((EQUAL (CAAR L) ‘Pīķa) (+ 1 (PIKI

(CDR L))))(T(PIKI (CDR L))) ))(DEFUN ERCENI (L) ...

102RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursija PROG-izteiksmēsRekursija PROG-izteiksmēs

• Apakšsarakstu apstrāde(DEFUN ADD2 (L) (PROG (M N X)

(SETQ M L) (SETQ N 0)A (COND ((NULL M) (RETURN N)))

(SETQ X (CAR M)) (SETQ M (CDR M))(COND ((ATOM X) (SETQ N (+ N X)))

(T (SETQ N (+ N (ADD2 X)))))

(GO A) ))

103RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

SaīsināšanaSaīsināšana

• Iepriekšējais variants(COND ((ATOM X) (SETQ N (+ N

X)))(T (SETQ N (+ N (ADD2

X)))))

• Īsāk(SETQ N (+ N (COND ((ATOM X) X)

(T (ADD2 X)) )))

104RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Apakšsarakstu apstrādeApakšsarakstu apstrāde

• Noteiksim funkciju ADD3– arguments ir apakšsarakstu saraksts– vērtība - katra apakšsaraksta elementu

summa atsevišķi– ja X ir ((2 4)(3 1)(6 2)), tad (ADD3 X) ir

(6 4 8)

(DEFUN ADD3 (L) (COND (( NULL L) NIL)(CONS (ADD2 (CAR L)) (ADD3 (CDR

L))) ))

105RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (1)Funkciju apvienošana (1)

(COND ((ZEROP K) (PROG NIL (SETQ Y X) (SETQ Z X)) ))

(COND ((ZEROP K) (PROGN (SETQ Y X) (SETQ Z X)) ))

K=0

Y = X

Z = X

106RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (2)Funkciju apvienošana (2)

• Noteiksim funkciju OPPMAX– argumenti

• skaitļu saraksts L• simbolu saraksts M

– vērtība - saraksta M elements, kurš pēc sava stāvokļa atbilst maksimālajam elementam no saraksta L

– ja L ir (3 7 13 9) un M ir (T E S T), tad (OPPMAX L M) ir S

107RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (3)Funkciju apvienošana (3)

(DEFUN OPPMAX (L M) (PROG (A B U V Y Z)

A - kandidāts uz maksimālo elementusākotnēji saraksta L pirmais elements

B - atbilstošais sarakstā M elementssākotnēji arī pirmais

Ja tiek atrasts elements, kurš ir lielāks par A, tad jaunu vērtību iegūst gan A gan B

108RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (4)Funkciju apvienošana (4)

(SETQ A (CAR L)) (SETQ B (CAR M))(SETQ U (CDR L)) (SETQ V (CDR M))

G (COND ((NULL U) (RETURN B)))(SETQ Y (CAR U)) (SETQ Z (CAR V))(SETQ U (CDR U)) (SETQ V (CDR V))(COND ((> Y A)

(PROGN (SETQ A Y)(SETQ B Z)) ))(GO G) ))

109RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļošanas noteikums (1)Izskaitļošanas noteikums (1)

(SETQ Z 3)(SETQ Y (+ Z (SETQ Z 6)));y=3+6=9(SETQ Y (+ (SETQ Z 6) Z)))

;y=6+6=12• Funkcijas izskaitļošanas noteikums

– lai izskaitļotu funkciju, tās argumenti gan atomi, gan griešanas pie funkcijām, tiek izskaitļoti pēc kārtas no kreisās uz labo

– pēc tam funkcijas definīcija tiek pielietota šim vērtību sarakstam

110RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļošanas noteikums (2)Izskaitļošanas noteikums (2)

• AND un OR izskaitļotas citādā veidā– (AND X Y ...)

• vērtība ir ne NIL, ja visi argumenti ir ne NIL• ja X ir NIL, tad (AND X Y) vērtībai ir jābūt

NIL• nav nepieciešams izskaitļot Y• tas ne tikai saīsina laiku, bet arī aizsargā no

kļūdu rašanās• (AND (ATOM M)(EQ L M)) ; pareizi• (AND (EQ L M) (ATOM M)) ; kļūdaini

111RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļošanas noteikums (3)Izskaitļošanas noteikums (3)

–(OR X Y ...)•vērtība ir ne NIL, ja ik viens arguments ir ne NIL

•ja X ir ne NIL, tad (OR X Y) vērtībai ir jābūt ne NIL

•nav nepieciešams izskaitļot Y•saīsina laiku

112RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (1)Izskaitļojoša funkcija (1)

• Ja ir mainīgais, kura vērtība ir saraksts• Ja saraksts var saprast, ka griešanās

pie funkcijas– par pirmo elementu kalpo funkcijas vārds– citi elementi ir tās funkcijas argumenti

• Lai atrastu šīs funkcijas vērtību, jālieto funkciju EVAL

• Ja X ir (+ 2 3), tad (EVAL X) ir 5

113RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (2)Izskaitļojoša funkcija (2)

• Ar EVAL palīdzību var izpildīt operatoru– kuru ir izveidojusi paša LISP- programma– kurš var mainīties programmas izpildes

procesā

• Noteikt funkciju– mainīgais NAME – funkcijas nosaukums– mainīgais PARAMETERLIST - šīs funkcijas

parametru saraksts– mainīgais DESCRIPTION – šis funkcijas apraksts

114RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (3)Izskaitļojoša funkcija (3)

(EVAL (LIST ‘DEFUN NAME PARAMETERLIST

DESCRIPTION ))• Funkcija LIST izveido sarakstu formā (DEFUN

n p d), – kur n, p un d – ir mainīgajos NAME,

PARAMETERLIST un DESCRIPTION atbilstošā vērtība

• Pēc tam šis saraksts tiek izskaitļots – tiks definēta jauna funkcija

115RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (4)Izskaitļojoša funkcija (4)

• Ja NAME ir simbolu rinda “DIFFERENCE”

• ja PARAMETERLIST ir (X Y) - ir saraksts no burtiem X un Y

• ja DESCRIPTION ir saraksts (PLUS X (MINUS Y))

• tad augstāk minētā EVAL izpilde kalpos funkcijas DIFFERENCE noteikšanai

116RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (1)Programma kā dati (1)

• Programma ir sarakstu struktūra• Izmantosim mainīgos, kuru vērtības būs

programmas dažādas sastāvdaļas• Izskatīsim funkciju

(FOR I J K L DESCR)– kura atbilst operatoram

for I:=J step K until L do DESCR;

117RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (2)Programma kā dati (2)

• Funkcijas (FOR I J K L DESCR) vērtībai jābūt :

( ( SETQ I J)B (COND ((> I L) (GO A)))

descr (SETQ I (+ I K)) (GO B)

A )kur descr – mainīgā DESCR vērtība

• Būtiska problēma - iezīmes B un A

118RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (3)Programma kā dati (3)

• Iezīmes B un A problēma– nav iespējams garantēt, ka simboli B un A netiks

izmantoti kā iezīmes programmas daļā, kuru ietver DESCR

– Ir iespējams izsaukt FOR vairākas reizes vienā programmā

– tas novedīs pie atkārtoti noteiktām iezīmēm– šī problēma tiek risināta ar valoda LISP funkcijas

GENSYM• funkcija bez argumentiem• ģenerē atomus, kuri atšķiras no atomiem, kuri

tika iegūti ar tās palīdzību agrāk

119RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (4)Programma kā dati (4)

(DEFUN FOR (I J K L D) (PROG (W X Y Z)(SETQ X (APPEND D (LIST (LIST ‘SETQ I

(LIST ‘+ I K)))))

(SETQ Y (GENSYM)) (SETQ Z (GENSYM))(SETQ X (APPEND X (LIST (LIST ‘GO Y) Z) ))(SETQ W (LIST (LIST ‘SETQ I J)

Y (LIST ‘COND (LIST (LIST ‘> I L) (LIST ‘GO Z )))))

(RETURN (APPEND W X)) ))

;W - veidojamās programmas pirmā daļa, X – otrā daļa

120RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (5)Programma kā dati (5)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts(SETQ X (APPEND D

(LIST (LIST ‘SETQ I (LIST ‘+

I K) ) ) ) ) X iegūs vērtību((PRINT N) (SETQ N (+ N 2 )))

121RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (6)Programma kā dati (6)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts

(SETQ Y (GENSYM))(SETQ Z (GENSYM))Y iegūs vērtību “Gen1”Z iegūs vērtību “Gen2”

122RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (7)Programma kā dati (7)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts

(SETQ X (APPEND X (LIST (LIST ‘GO Y) Z)

) )X iegūs vērtību((PRINT N) (SETQ N (+ N 2 )) (GO

Gen1) Gen2)

123RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (8)Programma kā dati (8)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts(SETQ W (LIST (LIST ‘SETQ I J)

Y (LIST ‘COND (LIST (LIST ‘> I L) (LIST ‘GO Z )

) ) ) )W iegūs vērtību( (SETQ N 1) Gen1 (COND ((> N 100)(GO Gen2))) )

124RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (9)Programma kā dati (9)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts(RETURN (APPEND W X))Funkcija FOR iegūs vērtību

( (SETQ N 1)Gen1 (COND ((> N 100) (GO Gen2)))

(PRINT N) (SETQ N (+ N 2 )) (GO Gen1 )

Gen2)

125RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (10)Programma kā dati (10)

• Funkcijas FOR rezultāts ir saraksta veida struktūra, kas atbilst programmai

• Lai izpildītu šo programmu, jāgriežas pie funkcijas EVAL

(EVAL (FOR ‘N 1 2 100 ‘((PRINT N))) )

Recommended