A Pascal nyelv

IP Pascal

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

label exit;
goto exit;

'_' karakter az azonosítókban

var my_number: integer;

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

    inherited x
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

    x := 1
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
    a(x*5)


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:
  • maxlint
  • maxcrd
  • maxlcrd

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

    n := number(1);
    ...

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;

    next: alpha_ref;
virtual procedure x(d: integer);
begin
    a := d;
    self := next
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.