![[Indekso]](bildoj/indekso.gif)
Leksiko. La normoj tre strikte difinas la eksteran prezenton de la programoj en ADA. La lingvo estas registrumblinda, kaj ni uzas ĉefliterojn por neformale apartigi la apriorajn nomojn. La ŝlosilvortoj en ADA estas tre multnombraj kaj rezervitaj (ni ilin substrekas). Komentarion komencas du apudaj minusoj -- kaj fermas la sekva linifino (ekz-e la programpecoj pri racionoj kaj duoniga serĉo).
La aranĝo de programo. Kompleta programo en ADA estas bindata el bibliotekaj pecoj (angle "library unit") anticipe tradukitaj. La lingvo kaj ĝiaj tradukaj rimedoj provizas la kontrolon, ĉu la interfacoj de la pecoj koheras. Se ene de iu biblioteka peco oni bezonas atingi objektojn de aliaj pecoj, la nomoj de tiuj aliaj pecoj estas listigendaj en speciala kunteksta sekcio (angle "context clause"), kiel montras la peco pri duoniga serĉo.
Enkapsuligo, abstraktaj datumtipoj. Pakaĵa tradukpeco povas enkapsuligi ne nur datumojn (kiel estas en la pakaĵo), sed ankaŭ agojn (procedurojn). En tiu kazo krom la interfaca pakaĵo (analogia al la "difina modulo" de MODULA) oni registras en la biblioteko ankaŭ la respondan pakaĵkorpon (analogian al la "realiga modulo" de MODULA). Ekz-e en la programo racionoj la interfaca pakaĵo specifas la racionojn preskaŭ kiel abstraktan datumtipon, dum la pakaĵkorpo difinas konkretan realigon de la operacioj.
Paralelado. ADA disponigas rimedojn por paralelado: oni povas deklari programpecon tasko; interago kaj sinkronigo de la taskoj (t.e. de la de ili priskribataj procezoj) estas farata per rendevuoj. Ekzemplo pri plurtaskado estas problemo pri la mortemaj manĝantaj filozofoj.
Esceptoj, generaj programpecoj. Vd la koncernajn artikolojn.
PACKAGE racionoj IS --------- la interfaca "difina" pakaĵo
TYPE raciona IS RECORD
supro: INTEGER; subo: POSITIVE; -- numeratoro kaj denominatoro
END RECORD;
FUNCTION egalas(x,y: raciona) RETURN BOOLEAN; -- ekz-e 1/2=2/4
FUNCTION "/"(x,y: INTEGER) RETURN raciona; -- racionkonstruilo
FUNCTION "+"(x,y: raciona) RETURN raciona; -- raciona adicio
FUNCTION "-"(x,y: raciona) RETURN raciona; -- raciona subtraho
FUNCTION "*"(x,y: raciona) RETURN raciona; -- raciona multipliko
FUNCTION "/"(x,y: raciona) RETURN raciona; -- raciona divido
END racionoj; -- la interfaca pakaĵo finiĝis
PACKAGE BODY racionoj IS --------- la realigo (pakaĵkorpo)
PROCEDURE samonigu(x,y: IN OUT raciona) IS -- kaŝitaĵo
xx: raciona; -- loka variablo
BEGIN IF x.subo=y.subo THEN RETURN; END IF;
xx:=x; x.subo:=x.subo*y.subo; x.supro:=x.supro*y.subo;
y.subo:=y.subo*xx.subo; y.supro:=y.supro*xx.subo;
END samonigu;
FUNCTION egalas(x,y: raciona) RETURN BOOLEAN;
u:raciona:=x; v:raciona:=y; -- lokaj variabloj, komencvalorizo
BEGIN samonigu(u,v); RETURN u.supro=v.supro;
END egalas;
FUNCTION "/"(x,y: INTEGER) RETURN raciona IS
BEGIN IF y>0 THEN RETURN (x,y); END IF; -- pozicia racion'indiko
RETURN (supro=>-x, subo=>-y); -- ŝlosila racion'indiko
END "/";
FUNCTION "+"(x,y: raciona) RETURN raciona IS
u:raciona:=x; v:raciona:=y;
BEGIN samonigu(u,v); RETURN (u.supro+v.supro, u.subo+v.subo);
END "+";
FUNCTION "-"(x,y: raciona) RETURN raciona IS
u:raciona:=x; v:raciona:=y;
BEGIN samonigu(u,v); RETURN (u.supro-v.supro, u.subo-v.subo);
END "-";
FUNCTION "*"(x,y: raciona) RETURN raciona IS
BEGIN RETURN (x.supro*y.supro, x.subo*y.subo); END "*";
FUNCTION "/"(x,y: raciona) RETURN raciona IS
BEGIN RETURN (x.supro*y.sube, x.subo*y.supro); END "/";
END racionoj;
![[Indekso]](bildoj/indekso.gif)
![[Instrukcio]](bildoj/kovrilo.gif)