IP Pascal
Bevezető
Az IP Pascal implementál egy "Pascaline" nyelvet, ami a Pascal ISO 7185 egy kibővített változata.
- modularitást ad a névtererek használatával
- parallel tasking monitor elve
- dinamikus tömbök
- túlterhelés és felüldefiniálás
- IP Porting Platform
IP Porting Platform tartalmaz:
Végülis az IP Pascal, mint a Pascaline implementációja lett értékesítve, de maga az IP Pascal programozási nyelv nyílt nyelvű maradt és számos implementációja keletkezett.
A továbbiakban ezen dokumentum csak az érdekességekre tér ki.
Lexikai elemek
Alfanumerikus goto cimke
'_' karakter az azonosítókban
Konstans kifejezések
Egy konstans deklarációjában szerepelhet egy másik konstans kifejezése.
const a = 10;
const b = a+10;
"halt" utasítás
A halt utasítás megállítja a programot futását, ezzel egy egyszerű hibakivédő mechanizmust kaphatunk.
procedure error;
begin
writeln('Program terminating');
halt
end;
Utasítások, vezérlési szerkezetek
Lásd:
itt,
itt és
itt
Alprogramok, modulok
Felüldefiniálás:
Egy másik modulban szereplő eljárás illetve függvény felüldefiniálásával új funkcionailitást tudunk hozzárendelni a régi definició helyett. Egyszerűen felűlírja az új definicióra a régit.
module test1;
virtual procedure x;
begin
end;
program test;
joins test1;
override procedure x;
begin
end;
begin
end.
Túlterhelés:
Az "overload" utasítással képesek vagyunk túlterhelni egy eljárást illetve függvényt.
procedure x;
begin
end;
overload procedure x(i: integer);
begin
end;
overload function x: integer;
begin
end;
Alprogramok
Paraméterátadás:
Védett paraméter
Eljárások illetve függvények "var" típusú paraméter helyett kaphatnak "view" típusú paramétert.
var x: integer;
procedure a(view b: integer);
begin
end;
begin
Egy view paraméterű változó akkor hasznos, ha biztosak akarunk lenni abban, hogy az eljárás alatt ne módosuljon a kapott paraméter.
type string10: packed array [1..10] of char;
procedure a(view s: string10);
...
Bővebben lásd:
itt,
itt és
itt
Típusok
Dinamikus tömb
Az IP Pascal nyelvben sikerült elérni elöszőr a Pascal nyelvek csoportjában, hogy a dinamikus tömb teljesen kompatibilis legyen az eredeti Pascal nyelv statikus tömbjével. Dinamukis tömböt a "new" parancsal lehet létrehozni. Egy dinamukus tömb típusú paramétert váró eljárás vagy függvény, a statikus tömb típust is elfogadja. Lásd példa:
program test(output);
type string = packed array of char;
var s: string;
procedure wrtstr(view s: string);
var i: integer;
begin
for i := 1 to max(s) do write(s[i])end;
begin
new(s, 12);
s := 'Hello, world';
wrtstr(s^); (* Dinamikus tömb *)
wrtstr('Thats all folks'); (* Statikus tömb *)
end.
Több dimenziós tömb is lehet.
Megnövelt tartományú változók
Pascaline nyelv új standard típusok sorozatát definiálta, amik kihasználják a kiterjesztett tartományokat:
- linteger: dupla méretű integer tartomány
- cardinal: előjel nélküli integer
- lcardinal: előjel nélküli, dupla méretű integer tartomány
Természetesen ezekhez új határokat definiáltak:
program test;
var a: linteger;
b: cardinal;
c: lcardinal;
d: 1..maxint*2;
...
Felsorolási típus
type number = (one, two, three);
var n: number;
begin
Boolean bit operator
program test;
var a, b: integer;
begin
a := a and b;
b := b or $a;
a := not b;
b := a xor b
end.
Bővebben lásd:
itt.
Sablonok
A nyelv nem támogatja a sablonokat (generic).
Kivételkezelés
try
...
except ...
else ...;
throw
A "try" utasítással letudjuk kezelni a felmerülő kivételeket. Amikor felmerül egy utasítássorozatban egy kivétel, automatikusan végrehajtódik az except után lévő utasítássok. A try utasítás tartalmaz egy else ágat is, amely lehetővé teszi az utasítássorozat normális végrehajtódását.
Kivételeket ki lehet váltani a throw() paranccsal.
Helyességbizonyítás
A nyelv nem támogatja a helyességbizonyítást.
Objektum-orientáltság
Az IP Pascalban az osztályok egy modul dinamikus példánya (és a modulok egy osztály statikus példánya). Az osztály egy kód-konstrukció csupán (nem típus)! Mivel az osztály egy modul, definiálhatunk benne kód-konstrukciókat, mint például konstansokat, változókat, eljárásokat, függvényeket, és ezeket publikussá lehet tenni az osztály felhasználói számára, vagy el lehet rejteni előlük a "private" kulcsszóval.
Az osztályok mint modulok automatikus hozzáféréssel rendelkeznek a saját névterükhöz, mint például C++ és a C# programnyelvekben. Az osztályon kívül viszont szükség van speciális azonosítóra vagy hivatkozásra. A hivatkozás egy mutató az objektumra, amit az osztály hoz létre. Az objektumot a new() utasítással lehet létrehozni és a dispose() utasítással lehet megszüntetni. Az osztály adattagjait, illetve metódusait a hivatkozáson keresztűl lehet elérni a "^" kulcsjellel.
Az osztály metódusaira alkalmazni lehet a túlterhelést illetve a felüldefiniálást is. A metódus amit felül szeretnénk definiálni, a "virtual" kulcsszóval meg kell jelölni.
program test;
uses baseclass;
class alpha;
extends beta;
type alpha_ref = reference to alpha;
var a, b: integer;
virtual procedure x(d: integer);
begin
end;
private
var q: integer;
begin
end.
var r: alpha_ref;
begin
new(r);
...
if r is alpha then r.a := 1;
r.x(5);
...
end.
Párhuzamosság
Lásd:
itt és
itt
Szabványos könyvtárak
Porting Platform
Az IP Pascal nyelvben számos modul illetve könyvtár áll rendelkezésre. Ezen könyvtárak minden egyes benne szereplő funkciójához prezentál egy idealizált alkalmazásprogramozási felületet (API), mint például:
- fájlok és kibővített operációsrendszer funkciók
- grafukus felületek
- MIDI és hang
Az egész kollekció az összes olyan operációsrendszeren implementálva van amin az IP Pascal megjelenik. Az IP Pascal a saját "porting platform"-lét használja, a saját alacsony szintű nyelvén, szóval amint a platform létrejön egy adott operációsrendszeren, mind az IP rendszer, mind a program képes futni rajta.
program hello(input, output);
uses gralib;
var er: evtrec;
begin
bcolor(output, green);
curvis(output, false);
auto(output, false);
page(output);
fcolor(output, red);
frect(output, 50, 50, maxxg(output)-50, maxyg(output)-50);
fcolorg(output, maxint, maxint-(maxint div 3), maxint-maxint div 3);
frect(output, 50, 50, 53, maxyg(output)-50);
frect(output, 50, 50, maxxg(output)-50, 53);
fcolorg(output, maxint div 2, 0, 0);
frect(output, 52, maxyg(output)-53, maxxg(output)-50, maxyg(output)-50);
frect(output, maxxg(output)-53, 52, maxxg(output)-50, maxyg(output)-50);
font(output, font_sign);
fontsiz(output, 100);
binvis(output);
fcolor(output, cyan);
cursorg(output, maxxg(output) div 2-strsiz(output, 'hello, world') div 2+3,
maxyg(output) div 2-100 div 2+3);
writeln('hello, world');
fcolor(output, blue);
cursorg(output, maxxg(output) div 2-strsiz(output, 'hello, world') div 2,
maxyg(output) div 2-100 div 2);
writeln('hello, world');
repeat event(input, er) until er.etype = etterm;
end.