5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

Tamás Kincső, OSZK, Analitikus Feldolgozó Osztály, osztályvezető A részdokumentumok szolgáltatása az ELDORADO-ban ELDORADO konferencia a partnerkönyvtárakkal.

„Esélyteremtés és értékalakulás” Konferencia Megyeháza Kaposvár, 2009
Erőállóképesség mérése Találjanak teszteket az irodalomban
Humánkineziológia szak
Öröklődés 2..
Generatív programozás
JavaScript.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Mérés és adatgyűjtés laboratóriumi gyakorlat Karakterisztikák mérése 1 Makan Gergely, Mingesz Róbert, Nagy Tamás V
Virtuális méréstechnika 12. Óra Karakterisztikák mérése November 21. Mingesz Róbert v
Mérés és adatgyűjtés laboratóriumi gyakorlat levelező 4. Óra Karakterisztikák mérése November 23. Kincses Zoltán, Mellár János v
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Ember László XUBUNTU Linux (ami majdnem UBUNTU) Ötödik nekifutás 192 MB RAM és 3 GB HDD erőforrásokkal.
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
Java programozási nyelv 5. rész – Osztályok III.
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
Reprezentációs függvény. Adva egy adattípus absztrakt és konkrét specifikációja: d a = ( A, F, E a ); d c = ( C, G, E c ); A = {A 0,..., A n };C = {C 0,...,
6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Programozási nyelvek II. (Az Ada) Kocsisné Dr. Szilágyi Gyöngyi.
5. előadás Parametrikus polimorfizmus. Generikus programozás
2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok.
Annotációk a Java 5 nyelvben Kozsik Tamás. Annotációk Módosítószavak bővítése A programszöveg elemeihez rendelhetők –Csomagokhoz, típusokhoz, metódusokhoz,
Az Input-Output használata Az input-outputot a nyelv előredefiniált csomagokon keresztül valósítja meg. Mindegyik csomag az Ada alapcsomag gyereke.
8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.
2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok.
6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.
Programozási nyelvek I. (Az Ada) Kozsik Tamás
4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.
Szerkezeti elemek teherbírásvizsgálata összetett terhelés esetén:
6. Előadás Merevítő rendszerek típusok, szerepük a tervezésben
Darupályák tervezésének alapjai
7. előadás Paraméterátadás. Paraméterek az Adában. Túlterhelés
4. előadás Az Ada típusai és típuskonstrukciós eszközei, II
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
dr. Szalkai István Pannon Egyetem, Veszprém
szakmérnök hallgatók számára
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
Alprogramok deklarációja, definíciója és meghívása Páll Boglárka.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
A klinikai transzfúziós tevékenység Ápolás szakmai ellenőrzése
2006. Peer-to-Peer (P2P) hálózatok Távközlési és Médiainformatikai Tanszék.
QualcoDuna interkalibráció Talaj- és levegövizsgálati körmérések évi értékelése (2007.) Dr. Biliczkiné Gaál Piroska VITUKI Kht. Minőségbiztosítási és Ellenőrzési.
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Egyenesvonalú (lineáris) adatszerkezetek
Objektum orientált programozás
A Visual Basic nyelvi elemei
A KÖVETKEZŐKBEN SZÁMOZOTT KÉRDÉSEKET VAGY KÉPEKET LÁT SZÁMOZOTT KÉPLETEKKEL. ÍRJA A SZÁMOZOTT KÉRDÉSRE ADOTT VÁLASZT, VAGY A SZÁMOZOTT KÉPLET NEVÉT A VÁLASZÍV.
Algoritmizálás, adatmodellezés
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Példa. Az ábrázolás szemléltetése.  = ({stack, elem },{ create :  stack; push : stack elem  stack}),  = ( {vector, nat, elem}, { create c :  vector.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Programozási nyelvek típusossága.
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Függvénysablonok használata
5. előadás Parametrikus polimorfizmus. Generikus programozás
Előadás másolata:

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

2 Polimorfizmus Többalakúság Programozási nyelvek: több típussal való használhatóság – Alprogram – Adatszerkezet – Változó Kifinomultabb típusrendszerek

3 A polimorfizmus fajtái Parametrikus polimorfizmus – erről lesz most szó Altípusos polimorfizmus – objektumelvű nyelvek – általában öröklődés alapján Esetleges (ad-hoc)‏ – túlterhelés, típuskényszerítés

4 Parametrikus polimorfizmus Típussal való paraméterezés Sok nyelvben – Modern funkcionális nyelvek (ML, …)‏ – Ada, C++, Java – CLU, Eiffel stb. Generikus programozás

5 Generic programming Algoritmusok és adatszerkezetek általános, típusfüggetlen leprogramozása Generikus rendezés, generikus verem Sablon: generic, template

6 Generikus felcserélés (C++)‏ template void swap( T& a, T& b )‏ { T c = a; a = b; b = c; }

7 Generikus felcserélés (Ada)‏ generic type T is private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap;

8 Generikus verem (C++)‏ template class Stack public: Stack ( int max ); void push ( const Element& e ); Element pop(); bool empty() const; … // további műveletek private: … // reprezentáció }; … // műveletek megvalósítása

9 Generikus verem (Ada)‏ generic type Element is private; package Stacks is type Stack( Max: Positive ) is limited private; procedure Push ( S: in out Stack; E: in Element ); procedure Pop ( S: in out Stack; E: out Element ); function Is_Empty ( S: Stack ) return Boolean; további műveletek private reprezentáció end Stacks; … -- műveletek megvalósítása a csomag törzsében

10 Sablonok használata Bizonyos nyelvekben (Ada, C++) konkrét példányokat kell létrehozni belőlük – A sablon csak példányosításra használható Más nyelvekben (funkcionális ny., Java) erre nincs szükség – Mindig ugyanaz a kód hajtódik végre, nincs példányosítás

11 Példányosítás A sablon programegységekre alkalmazható művelet – Alprogram programegység: hívható – Csomag programegység: komponensei elérhetők Egy sablon alapján elkészít egy „igazi” programegységet – Alprogramot, csomagot, osztályt Emiatt tekintjük a generikus programozást generatívnak

12 Generatív programozás Generative programming Program generálása programmal Egy speciális fajtája: a generikus programozás Egy másik fajtája: a template metaprogramming A C++ template nem csak generikus, hanem generatív programozást támogató eszköz is

13 Verem példányosítása (C++)‏ … Stack stack(10); stack.push(4); stack.push(2); if ( ! stack.empty() )‏ { stack.pop(); } …

14 Verem példányosítása (Ada)‏ package Int_Stacks is new Stacks(Integer); S: Int_Stacks.Stack(10); E: Integer; … Int_Stacks.Push( S, 4 ); Int_Stacks.Push( S, 2 ); if not Int_Stacks.Is_Empty( S ) then Int_Stacks.Pop( S, E ); end if;

15 Ha use-t használunk package Int_Stacks is new Stacks(Integer); use Int_Stacks; S: Stack(10); E: Integer; … Push( S, 4 ); Push( S, 2 ); if not Is_Empty( S ) then Pop( S, E ); end if;

16 Felcserélés példányosítása (C++)‏ Alprogramoknál implicit példányosítás Típuskikövetkeztetés alapján int x = 4, y = 2; double u = 1.2, v = 2.1; swap(x,y); swap(u,v);

17 Felcserélés példányosítása (Ada)‏ procedure Int_Swap is new Swap(Integer); procedure Float_Swap is new Swap(Float); X: Integer := 4; Y: Integer := 2; U: Float := 1.2; V: Float := 2.1; … Int_Swap(X,Y); Float_Swap(U,V);

18 Különbségek a példányosításban Alprogram – Ada: explicit, C++: implicit Csomag/osztály – Ada: önállóan áll, C++: „on-the-fly” Lusta példányosítás: C++ – Egy sablonosztályból csak a használt alprogramok példányosulnak

19 Ada: programegység definiálása példányosítással Alprogramsablonból alprogram, csomagsablonból csomag hozható létre procedure Int_Swap is new Swap(Integer); package Int_Stacks is new Stacks(Integer); Ezekben a definíciókban nem adunk meg törzset (a törzs generálódik, makrószerűen)‏ Beágyazva vagy könyvtári egységként

20 Példányosítás beágyazva with Ada.Text_IO; use Ada.Text_IO; procedure Szines is type Szín is (Piros, Kék, Sárga); package Szín_IO is new Enumeration_IO(Szín); Sz: Szín; begin Szín_IO.Get( Sz ); Szín_IO.Put( Sz ); … end Szines;

21 Példányosítás könyvtári egységként with Ada.Text_IO; package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer); Egy fordítási egység Használat: with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

22 Tipikus hiba a use kapcsán A sablon programegységek komponenseit nem lehet elérni – A sablon csak példányosításra való Ezért nincs értelme (és tilos) use utasítást adni egy sablonra (pl. a „use Stacks;” helytelen)‏ – Sem csomagsablonra, sem alprogramsablonra – Hasonlóan az alprogramokhoz – Csomagsablonból létrehozott példányra már lehet use-t használni (pl. a „use Int_Stacks;” helyes)‏

23 Sablonok definiálása Sablon: egy programegység – Példányosításra való programegység Felépítése: specifikáció és törzs – Szintaktikusan szétváló Definiálható beágyazva és könyvtári egységként is Alprogramsablon és csomagsablon

24 Sablon specifikációja és törzse (1)‏ generic type T is private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; Mindig különálló, alprogram- sablon esetén is!

25 Sablon specifikációja és törzse (2)‏ generic type Element is private; package Stacks is … end Stacks; package body Stacks is … end Stacks;

26 Sablon könyvtári egység Két fordítási egység a specifikáció és a törzs – Mind alprogram-, mind csomagsablon esetén – Mint a csomag könyvtári egység – GNAT:.ads és.adb forrásfájlok Gyakoribb, mint a beágyazás

27 Sablon definíciója beágyazva (1)‏ package Ada.Text_IO is … generic type Num is range <>; package Integer_IO is … procedure Get ( Item : out Num; Width : in Field := 0 ); … end Integer_IO; … end Ada.Text_IO;

28 Sablon definíciója beágyazva (2)‏ package body Ada.Text_IO is … package body Integer_IO is … procedure Get ( Item : out Num; Width : in Field := 0 ) is … end Get; … end Integer_IO; … end Ada.Text_IO;

29 Sablon definíciója beágyazva (3)‏ with Ada.Text_IO; package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer); with Ada.Text_IO; use Ada.Text_IO; procedure Számos is package Pos_IO is new Integer_IO(Positive); begin Pos_IO.Put( 1024 ); end Számos;

30 Sablon specifikációjának tördelése generic type Element is private; package Stacks is type Stack ( Max: Positive ) is limited private; … end Stacks; generic type T is private; procedure Swap( A, B: in out T );

31 Sablonok formális paraméterei Típus C++ és Ada: objektum sablon osztály (C++), sablon csomag (Ada)‏ Ada: alprogram

32 Sablon típusparamétere generic type T is private; … Paraméter típus: átlátszatlan A sablonban nem ismerem a T-nek megfeleltetett aktuálisnak a szerkezetét

33 Átlátszatlan generic type Element is private; package Stacks is type Stack(Max: Positive) is limited private; … private … type Stack(Max: Positive) is …; end Stacks; A Stacks- en belül A Stacks- en kívül

34 Sablon objektumparamétere (C++)‏ template class Stack { public: Stack(); void push ( const Element& e ); … }; Stack s;

35 Sablon objektumparamétere (Ada)‏ generic type Element is private; Max: Positive; package Stacks is type Stack is limited private; procedure Push ( S: in out Stack; E: in Element ); … end Stacks; package Int_Stacks is new Stacks(Integer,10); S: Int_Stacks.Stack;

36 Sablonparaméter versus típus-/konstruktorparaméter genericpackage IStacks is type Element is private; new Stacks(Integer,10); Max: Positive;use IStacks; package Stacks isS1, S2: Stack; type Stack is limited private; … package IStacks is new Stacks(Integer); genericuse IStacks; type Element is private;S1: Stack(5); S2: Stack(10); package Stacks is type Stack(Max: Positive) is limited private; …

37 Sablon kimenő objektumparamétere Az Adában a sablon objektumparamétere lehet in, out és in out módú is Olyan, mint az alprogramok paraméterei Alapértelmezett mód: in Legtöbbször in módút használunk

38 Sablon objektumparaméterének alapértelmezett értéke Csak bemenő paraméter esetén generic type Element is private; Max: Positive := 10; package Stacks is … end Stacks; package I30_Stacks is new Stacks(Integer,30); package I10_Stacks is new Stacks(Integer);

39 Alprogrammal való paraméterezés Funkcionális nyelvekben magától értetődő Procedurális nyelvekben nehézkesebb – Szintaktikus, szemantikus, hatékonysági kérdések Alprogram átadása alprogramnak – Lokális alprogram? Csonk. (Modula-2)‏ – Csak globális alprogram: C, Ada 95… Alprogramra mutató mutató átadása (C++, Ada 95)‏ Funktor (C++ szépen, Java nehézkesen)‏ Sablon alprogramparaméterei: Ada

40 Ada sablonok alprogramparaméterei Sablon alprogramnak és sablon csomagnak A sablon példányosításakor adjuk meg az aktuális műveletet Nem annyira rugalmas, mint az „alprogramnak alprogramot” lehetőség – Fordítás közben „derül ki” az aktuális, meglehetősen korai kötés Gyakran egy típus művelete a paraméter

41 Példa: maximumkeresés generic type T is private; with function "<" (A, B: T) return Boolean; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum;

42 Tördelés és with generic type T is private; with function "<" (A, B: T) return Boolean; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum;

43 Sablon alprogramparaméterének alapértelmezett értéke (triviális eset)‏ generic type T is private; with function " ; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum;

44 Sablon alprogramparaméterének használata with Maximum; procedure Max_Demo is function I_Max is new Maximum( Integer, "<" ); function I_Min is new Maximum( Integer, ">" ); function F_Max is new Maximum( Float ); … end Max_Demo;

45 Ugyanez a C++ nyelvben template T maximum( T a, T b )‏ { if ( a < b ) return b; else return a; } int m = maximum( 46*32, 64*23 );// az aktuális: int

46 Különbségek első pillantásra A C++ nyelvben egyszerűbb: nincs a sablonnak alprogramparamétere Az Adában ugyanaz a sablon több feladat elvégzésére használható – ha más paramétert adok meg

47 Sablonszerződés A sablon specifikációja megadja, hogy hogyan lehet a sablont használni – Azaz hogyan lehet példányosítani… A sablon specifikációja egy „szerződés” a sablon törzse és a példányosítás között Ha a példányosítás betartja a szerződést, akkor a sablonból generált kód helyes lesz

48 Függések A sablon specifikációja A sablon törzse Példányosítás Nem kell!! ?

49 A szerződés kimondja: A sablon törzse nem használhat mást, csak amit a sablon specifikációja megenged neki A példányosításnak biztosítania kell mindent, amit a sablon specifikációja megkövetel tőle

50 A sablon törzse betartja generic type T is private; with function " ; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; legális

51 A példányosítás betartja with Maximum; procedure Max_Demo is function I_Max is new Maximum( Integer, "<" ); function I_Min is new Maximum( Integer, ">" ); function F_Max is new Maximum( Float ); … end Max_Demo;

52 Milyen a szerződés a C++ nyelvben? A sablon „specifikációja” az egész definíció – A belsejét is ismerni kell, hogy tudjuk, hogyan lehet példányosítani Ezért is írjuk az egészet fejállományba Az információ elrejtésének elve sérül – Az olvashatóság rosszabb – A bonyolultság nagyobb – A módosítások bajt okozhatnak (lusta példányosítás)‏ – A fejlesztés nehezebb

53 A példánkban: template T maximum( T a, T b )‏ { if ( a < b ) return b; else return a; } int m = maximum( 46*32, 64*23 );// az aktuális: int

54 Taktika A sablon specifikációjában kérjünk… – olyan keveset a példányosítástól, amennyire csak lehet, – de amivel még meg tudjuk írni a törzset Így nő a sablon újrafelhasználhatósága Ellenérv: hatékonyság, könnyebb használat

55 Hogyan kérjünk kevesebbet a példányosítástól? (1)‏ with Maximum, Ada.Text_IO; procedure Max_Demo is function Kisebb ( A, B: String ) return Boolean is … end Kisebb; -- fordítási hibát okoz: function S_Max is new Maximum( String, Kisebb ); begin Put_Line( S_Max( "Szia", "Salut" ) ); end Max_Demo;

56 Nem teljesen definiált típust is megengedünk generic type T(<>) is private; with function " ; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; Így már lehet az aktuális a String

57 Az új szerződés értelmében: A példányosításkor választhatjuk az aktuális paramétert – teljesen meghatározott, valamint – nem teljesen meghatározott típusúnak is A sablon törzsében nem hozhatok létre objektumot ebből a típusból

58 Ha az aktuális lehet indefinit generic type T(<>) is private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; Fordítási hiba

59 Hogyan kérjünk kevesebbet a példányosítástól? (2)‏ with Maximum, Ada.Text_IO; procedure Max_Demo is type R is limited record … end record; function Kisebb ( A, B: R ) return Boolean is … end Kisebb; -- fordítási hibát okoz: function R_Max is new Maximum( R, Kisebb ); … end Max_Demo;

60 Korlátozott típust is megengedünk generic type T is limited private; with function " ; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; Így már lehet az aktuális a korlátozott rekord (R)‏

61 Ha az aktuális lehet korlátozott generic type T is limited private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; Fordítási hiba

62 Összefoglalva (in)definit (nem) korlátozott type T(<>) is limited private obj. létrehozásdefinit (nem) korlátozott type T is limited private; := = /=(in)definit nem korlátozott type T(<>) is private; obj. létrehozás := = /= definit nem korlátozott type T is private; TörzsbenAktuálisFormális A sablon alprogram- paraméterei mellett

63 Korlátozott indefinit típust is megengedünk generic type T(<>) is limited private; with function " ; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum;

64 Példányosíthatom akár így is with Maximum, Stacks; procedure Max_Demo is package IStacks is new Stacks(Integer); use IStacks; function Kisebb ( A, B: Stack ) return Boolean is begin if Is_Empty(B) then return False; else return Is_Empty(A) or else Top(A) < Top(B); end if; end Kisebb; function S_Max is new Maximum( Stack, Kisebb ); …

65 Sablon típusparaméterei Átlátszatlan típus (private + műveletek)‏ Könnyítés a példányosításon, szigorítás a sablontörzs lehetőségein: (<>), limited, tagged, abstract A típus szerkezetére tett megszorítás: típusosztály

66 Típusosztályok használata (1)‏ generic type Element is private; type Index is (<>); type Vector is array (Index range <>) of Element; with function Op( A, B: Element ) return Element; Start: in Element; function Fold ( V: Vector ) return Element;

67 Típusosztályok használata (2)‏ function Fold ( V: Vector ) return Element is Result: Element := Start; begin for I in V’Range loop Result := Op( Result, V(I) ); end loop; return Result; end Fold; Szummázás programozási tétel

68 Típusosztályok használata (3)‏ with Fold; procedure Fold_Demo is type T is array ( Integer range <> ) of Float; function Sum is new Fold( Float, Integer, T, "+", 0.0 ); function Prod is new Fold( Float, Integer, T, “*", 1.0 ); … end Fold_Demo;

69 Néhány fontos típusosztály- megjelölés Egész típus type T is range <>; Diszkrét típus type T is (<>); Moduló, lebegőpontos, fixpontos, decimális fixpontos Tömb, mutató, diszkriminánsos, származtatott, kiterjesztett

70 Mire jó a típusosztály A sablon törzsében használhatók a típusosztályra jellemző műveletek – Diszkrét: lehet tömb indextípusa – Tömb: indexelhető, van ‘Range attribútuma A példányosításkor csak olyan aktuális paraméter választható – Integer – type T is array (Integer range <>) of Float

71 Ha a paraméter egy tömb típus Gyakran az elem- és az indextípus is paraméter – Persze ilyenkor az indextípus „(<>)” vagy „range <>” Nem mindegy, hogy megszorított, vagy megszorítás nélküli indexelésű type T is (Index range <>) of Element; type T is (Index) of Element; – nem feleltethetők meg egymásnak sem így, sem úgy Lehet többdimenzióst is

72 Kétdimenziós, lebegőpontos generic type Element is digits <>; type Index is (<>); type Matrix is array (Index range <>, Index range <>)‏ of Element; package Matrix_Arithmetics is function "*" (A, B: Matrix ) return Matrix; … end Matrix_Arithmetics;

73 Sablonok csomagparamétere generic with package Arithmetics is new Matrix_Arithmetics(<>); use Arithmetics; function Inverse( M: Matrix ) return Matrix; Példányosításnál az aktuális paraméter a Matrix_Arithmetics csomagsablonból létrehozott példány kell, hogy legyen

74 Sablon a sablonban generic … package … generic … function … end; Sablonok egymásba ágyazhatók

75 generic type Element is private; package Stacks is type Stack( Capacity: Positive ) is limited private; procedure Push( S: in out Stack; Item: in Element );... generic with procedure Process_Element( Item: in Element ); procedure For_Each( S: in Stack ); private type Vector is array( Natural range <> ) of Element; type Stack( Capacity: Positive ) is record Last: Natural := 0; Data: Vector(1..Last); end record; end Stacks;

76 package body Stacks is procedure Push( S: in out Stack; Item: in Element ) is begin S.Last := S.Last + 1; S.Data(S.Last) := Item; end Push;... procedure For_Each( S: in Stack ) is begin for I in S.Data'First.. S.Last loop Process_Element( S.Data(I) ); end loop; end For_Each; end Stacks;

77 with Stacks, Ada.Integer_Text_IO; procedure Stack_Demo is package IStacks is new Stacks(Integer); procedure Put_Int( Item: Integer ) is begin Ada.Integer_Text_IO.Put(Item,0); end Put_Int; procedure Put_Stack is new IStacks.For_Each(Put_Int); S: IStacks.Stack(100); begin IStacks.Push(S,3); IStacks.Push(S,66); IStacks.Push(S,91); Put_Stack(S); end Stack_Demo;

78 Iterátor Adatszerkezet bejárása (ciklussal)‏ Minden elemmel csinálni kell valamit Külső iterátor – A ciklus a klienskódban van – Az adatszerkezet-objektumtól független iterátorobjektum Belső iterátor – A ciklus az adatszerkezet implementációján belül van – Az elemeken végzendő művelettel paraméterezett művelet – Stacks.For_Each

79 with Stacks; procedure Stack_Demo is package IStacks is new Stacks(Integer); use IStacks; function Multiplicity( S: Stack; Pattern: Integer )‏ return Natural is Counter: Natural := 0; procedure Compare( Item: in Integer ) is begin if Item = Pattern then Counter := Counter + 1; end if; end Compare; procedure Compare_All is new For_Each(Compare); begin Compare_All(S); return Counter; end Multiplicity; begin... end Stack_Demo;

80 Rekurzív alprogramsablon function Fold_R ( V: Vector ) return Element is begin if V’Length = 0 then return Start; elsif V’Length = 1 then return V(V’First); else return Op( V(V’First), Fold_R( V(Index’Succ(V’First).. V’Last) ) ); end if; end Fold_R; Folding from the right

81 „Egyke” generic type Element is private; Max: in Positive := 1024; package Stack is procedure Push( X: in Element ); procedure Pop( X: out Element ); function Top return Element; function Is_Empty return Boolean; … end Stack;

82 Lehet több is belőle with Stack; procedure Egyke_Demo is package V1 is new Stack(Integer, 10); package V2 is new Stack(Float); package V3 is new Stack(Float); begin V1.Push(3); V2.Push(3.0); V3.Push(V2.Top); end Egyke_Demo; Fordítási időben meghatározott számú verem létrehozására

83 Függelék: típusosztályok jelölése Diszkrét típustype T is (<>); Előjeles egésztype T is range <>; Moduló típustype T is mod <>; Lebegőpontostype T is digits <>; Fixpontostype T is delta <>; Decimális fixpontostype T is delta <> digits <>; Korlátozott, indefinit, jelölt, osztályszintű, absztrakt, nem dinamikusra mutató Definit tömb, indefinit tömb, álneves elemű tömb, diszkriminánsos, mutató, konstansra mutató, származtatott, kiterjesztett