• Nem Talált Eredményt

fejezet - Kiiratás

A közismert „Hello World!” vagy magyarul a „Helló Világ!” program így néz ki mau nyelven:

"Hello World!\n"

Illetve:

"Helló Világ!\n"

És ezek után még valaki azt meri mondani, hogy a mau nyelv BONYOLULT?! Hát már hogy is lehetne ezt ennél egyszerűbben megoldani?!

A fentiek gondolom mindenkinek világosak: A mau nyelvben az (angol) idézőjel maga is egy utasítás, ami egyszerűen mindent kiír a következő idézőjelig. Kivéve, ha azon idézőjel előtt egy \ jel van, mert akkor az idézőjelet is kiírja. Azaz, megadhatóak itt is Escape szekvenciák, mint a stringeknél. Látjuk is az egyiket a fenti (rémségesen komplex...) programokban: a végén a \n jel jelenti az „újsor”

karaktert.

A fentieket így is írhattuk volna azonban:

"Helló Világ!"; /;

Ennek eredménye ugyanaz lett volna. A / is egy utasítás ugyanis a mau nyelvben, és annyit csinál, hogy egy újsor karaktert ír ki. Ha ezt egy olyan utasítás után adjuk ki, mely aritmetikai kifejezésre végződik, akkor ne felejtsünk el pontos­

vesszőt tenni az előző utasítás végére, nehogy az interpreter a per jelünket osztás­

jelként akarja értelmezni...

Létezik egy speciális Escape szekvencia is, ami képernyőtörlést eredményez, ez mau specialitás:

\z : Képernyőtörlés. Egyenértékű a következő C nyelvű utasítással:

printf("\x1b[2J\x1b[H");

Azaz egy konkrét példán bemutatva:

"\z"

A fenti printf utasításnál bemutatott Escape-szekvenciasorozat valószínűleg jó minden szabványos Linux-terminálon, de annak érdekében hogy a mau interpretert hozzáigazíthassuk (forrásból fordítás esetén...) valamely egzotikus terminálhoz vagy terminálemulátorhoz, e szekvencia átállítható (fordítás előtt) a vz.h fájl ezen sorának megfelelő átírásával:

#define CLEARSCREENSTRING "\x1b[2J\x1b[H"

Alternatív kiíró utasításként alkalmazhatjuk a ? jelet is:

? "Helló Világ!\n"

Ennek így persze nem sok értelme van, mert minek tegyük oda a kérdőjelet, ha nem muszáj! Egyedül amiatt létezik ez, mert a kérdőjel segítségével irathatunk ki másfajta adatokat is, amennyiben a ? után odaírjuk a következő karakternek azt a karaktert, amit a # casting operátor után is szoktunk írni típusjelölőként. Azaz:

A ?c utasítás egy unsigned char értéket ír ki, mint számot.

A ?C utasítás egy signed char értéket ír ki, mint számot.

A ?i utasítás egy unsigned short int értéket ír ki, mint számot.

És így tovább.

Ezenfelül, a ?k utasítás az utána következő unsigned char értéknek megfelelő karaktert írja ki, MINT KARAKTERT tehát, azaz nem mint a bájt számértékét!

Ugyanez lesz az eredménye az egyedülálló ? karakterből álló utasításnak, vagyis annak, ha a kérdőjelet egy whitespace karakter követi.

Ügyeljünk a szintaxisra! Ugyanis:

Ez:

? "65cdefghijk" ; /;

kiírja magát az egész stringet.

Ez azonban:

? ("65cdefghijk") ; /;

azt a KARAKTERT írja ki, aminek az ASCII kódját az utána következő unsigned char típusú aritmetikai kifejezés határozza meg! Az egy zárójeles kifejezés. Azon belül egy konstans string van. Ezt az interpreter kötelességszerűen átalakítja unsigned char értékké, ami úgy megy, hogy kiolvassa, miféle numerikus konstans van a string első valahány bájtján. Ott „65” van, ezt adja vissza. Tehát az a karakter íródik ki, aminek az ASCII kódja 65, ez pedig az „A” karakter.

A képernyőtörléshez nem muszáj idézőjelek közé zárt Escape szekvenciával kínlódnunk, elég ennyit írni:

?z;

Fontos megemlíteni, hogy e kérdőjellel való kiiratások csak a stringekre és a fixpontos numerikus típusokra vonatkozóan pontosak! A lebegőpontos számok esetén, azaz a ?f, ?d, ?D utasításoknál ugyan kiír valami körülbelüli értéket, de ezt jobb ha nem használjuk, azaz ezen utasítások léteznek ugyan, de inkább csak tesztelési-debuggolási lehetőség gyanánt. Lebegőpontos számok kiiratását min­

denkinek magának kell megoldania, olyan pontossággal és formátumban, ahogyan jónak látja. A mau nyelv valamelyik következő verziójához feltehetőleg

készítek majd egy printf-szerű kiíró függvényt, ami tud majd valami effélét, de egyelőre ez egy nem implementált funkció még.

Továbbá: A casting operátoroknál mint tudjuk, megadható a castolási kódot jelző karakter aritmetikai kifejezésként, ha a # karaktert közvetlenül követi egy zárójel.

Ugyanez eljátszható a ? esetében is:

?(valamilyen_kifejezés) Amit_ki_akarunk_iratni

A mau nyelv beépített lehetőséget biztosít a Linux konzolra történő SZÍNES kiiratásra is! Szerepel ugyanis a megfelelő include fájlban e néhány direktíva:

#define COLOR_RED "\x1b[31m"

#define COLOR_GREEN "\x1b[32m"

#define COLOR_YELLOW "\x1b[33m"

#define COLOR_BLUE "\x1b[34m"

#define COLOR_MAGENTA "\x1b[35m"

#define COLOR_CYAN "\x1b[36m"

#define COLOR_WHITE "\x1b[37m"

#define COLOR_BRIGHT "\x1b[01m"

#define COLOR_UNDERLINE "\x1b[04m"

#define COLOR_RESET "\x1b[0m"

#define COLOR_BLACK "\x1b[30m"

#define BACKGROUND_COLOR_DEFAULT "\x1b[49m"

#define BACKGROUND_COLOR_BLACK "\x1b[40m"

#define BACKGROUND_COLOR_RED "\x1b[41m"

#define BACKGROUND_COLOR_GREEN "\x1b[42m"

#define BACKGROUND_COLOR_YELLOW "\x1b[43m"

#define BACKGROUND_COLOR_BLUE "\x1b[44m"

#define BACKGROUND_COLOR_MAGENTA "\x1b[45m"

#define BACKGROUND_COLOR_CYAN "\x1b[46m"

#define BACKGROUND_COLOR_LIGHTGRAY "\x1b[47m"

#define BACKGROUND_COLOR_DARKGRAY "\x1b[100m"

#define BACKGROUND_COLOR_LIGHTRED "\x1b[101m"

#define BACKGROUND_COLOR_LIGHTGREEN "\x1b[102m"

#define BACKGROUND_COLOR_LIGHTYELLOW "\x1b[103m"

#define BACKGROUND_COLOR_LIGHTBLUE "\x1b[104m"

#define BACKGROUND_COLOR_LIGHTMAGENTA "\x1b[105m"

#define BACKGROUND_COLOR_LIGHTCYAN "\x1b[106m"

#define BACKGROUND_COLOR_WHITE "\x1b[107m"

Ezek segítségével a megfelelő színkódokat a mau interpreter újrafordítása során könnyen hozzá tudjuk igazítani az aktuális terminál színértelmezéséhez. E színekre pedig a következő utasításokkal hivatkozhatunk:

Sd // innentől kezdve a default (azaz alapértelmezett) színnel ír (COLOR_RESET) Sv // világosság (bright) (COLOR_BRIGHT)

BR // világospiros (BACKGROUND_COLOR_LIGHTRED)

A színeket ráadásul meg lehet adni indirekt módon is, így:

Írásszín esetén:

S(x)

Háttérszín esetén:

B(x)

Ahol az „x” egy unsigned char típusú aritmetikai kifejezés, és az értéke (ered­

ménye) a megfelelő karakter kell legyen, amit fentebb leírtam az írásszín illetve a háttérszín esetén, tehát ami amúgy következne a parancs S illetve B karaktere után. Fontos tudni, hogy ezen esetekben NEM állhat semmiféle whitespace karakter az S vagy a B karakter és a nyitózárójel között!

Példaprogram a színekre: