A Shakespeare programozási nyelv

Hello World!

Ragaszkodva a régi szokásokhoz kezdjük el a tárgyalást egy egyszerű példával, a Hello World programmal. Lehet, hogy másként látszik, de a következő program célja kizárólag az, hogy kiírja a "Hello World!" szöveget. Ez az 1. példában található.

Boncolgassuk tehát a programot és lássuk, hogy működik!

A darab címe

Minden SPL program első sora a cím, vagy minden szöveg az első üres sorig. A kódba szabadon írható bárhova szóköz, újsor, a szerzők kérése kizárólag abban korlátoz, hogy a kód elrendezése ízléses legyen.

A cím kizárólag esztétikai célt szolgál, a parser szempontjából csak komment.

Dramatis personæ - a szereplők

A következő néhány sor egy lista a játékban szereplő alakokról. Tekintsük őket változóknak, amelyek előjeles egész (signed integer) típusúak. Ebben a részben minden olyan szereplőt deklarálni kell, amely a műben szerepel, ellenkező esetben a fordító hibaüzenettel leáll.

Egy deklaráció egy névből és az őt követő leírásából áll. Ez a leírás szintén kommentnek minősül. Akármilyen név nem választható, kizárólag valódi Shakespeare által megírt karakter neve, mint pl. Romeo, Juliet, vagy the Ghost (Hamlet néhai apja).

Felvonások és jelenetek, mint címkék

A felvonások (act) és jelenetek (scene) szerepe az előadás tagolása kisebb részekre. Egy előadás egy vagy több felvonásból, minden felvonás egy vagy több jelenetből áll, és minden jelenet sorokból (természetesen jelentéssel bíró sorokból), illetve ún. belépés (enter) és kilépés (exit, exeunt) részekből áll, amelyek a szereplők színpadra történő belépését, vagy a színpad elhagyását eredményezik.

A felvonások és a jelenetek római számokkal sorszámozottak. Az "Act" vagy a "Scene" szóval kezdődnek, amelyet a sorszám követ, majd a leírás arról, hogy mi történik az adott részben. Az ilyen jellegű leírások kommentnek minősülnek.

Mindamellett, hogy a felvonások és a jelenetek szép, beszédes információt adnak a program általuk tartalmazott részeiről, önmagukban címkék, amelyekre a program más részeinél történő végrehajtás során GOTO utasítással ugrani lehet. A Hello World programban nincsenek ilyen utasítások, ezekről később esik szó.

A szereplők és a színpad - láthatóság

Ahhoz, hogy egy szereplővel bármi is történjen vagy bármit is csináljon, a színpadon kell lennie. Ha valakire egyes szám második személyben történik hivatkozás ("you", "thou", stb.), akkor is a színpadon kell lennie. Viszont ha még valaki más is van a színpadon, akkor az ilyen hivatkozás nem egyértelmű és a parser ilyenkor nyöszörög.

Enter és Exit. Ezek a direktívák a szereplők színpadra lépését és annak elhagyását eredményezik. Az "Enter" direktívát egy vagy több szereplő neve követi, az "Exit"-et viszont kizárólag egy. Az Exit többes száma az "Exeunt", amelyet legalább két szereplő neve egészít ki, vagy ha csak önmagában áll, akkor hatására "kiürül a színpad".

Ha egy olyan szereplőt akarunk beléptetni a színpadra, aki már ott szerepel, az runtime errort, azaz futásidejű hibát okoz.

A programkód sorai

Egy sor a következő elemekből áll: egy szereplő neve, egy vessző, és egy vagy több mondat. A Hello World programban csak a mondatok két fajtája szerepel: kiíró mondat, amely a képernyőre ír, és utasítás, amely a második személyű szereplőnek értéket ad.

Konstansok

Ebben a részben a konstans értékek előállításáról lesz szó. Megjegyzés: szerintem ez a legérdekesebb rész! (Á.Z.)

Minden főnév egy konstans értéket képvisel, ami 1, vagy -1, attól függően, hogy szép-e, vagy nem. Például a "flower" (virág) értéke 1, mert a virágok szépek, viszont a "pig" (disznó) -1 értékű, mert a disznók koszosak. (Ez persze a legtöbb embert nem tántorítja el attól, hogy egyen belőlük.) A semleges főnevek, mint a "tree" (fa) is, 1 értékkel bírnak.

Ha egy főnevet egy melléknévvel minősítünk, azzal az értéke megkétszereződik. Ha mégegy melléknevet kap, még kettővel szorzódik, és így tovább. Így könnyen előállíthatók a kettőhatványok és ellentettjeik. Innentől elemi aritmetikával előjeles egész szám könnyen előállítható, úgy, mint "the sum of X and Y" (X és Y összege), ahol X és Y maguk is előjeles egészek.

Lássunk erre egy példát. Ha azt mondjuk, hogy "the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece" (a kicsi pónim és a nagy szőrös vadászkutyád különbsége négyzetének és a sajnálatosan kicsi ágyékkötőd köbének a különbsége), akkor az egy konkrét számot fog jelenteni. No de hogy a bánatba számoljuk ki ebből a nyakatekert kifejezésből, hogy melyik ez a szám?

No. Induljunk ki abból, hogy mit tudunk biztosan. Voltak azok a bizonyos főnevek. Ebben több is szerepel, úgy, mint "pony", "hound", és "codpiece". A póni szép, tehát az értéke 1. A vadászkutya, talán véreb (a magyar fordítás többértelmű) nem tudni, miért a negatív főnevek közé tartozik, így az értéke -1. Az ágyékkötő pedig biztosan azért -1 értékű, mert egy tisztátalan testtájékon szenved. Az eddig felsorolt szabályokat figyelembe véve tehát a "little pony" értéke 2, a "big hairy hound" értéke -4, a "sorry little codpiece" értéke pedig szintén -4. Innen már könnyű számolni, mert az idézetbe visszahelyettesítve az jön ki, hogy "the difference between the square of the difference between 2 and -4 and the cube of -4". Tovább csavarva a dolgot az eredmény egy tisztán aritmetikai kifejezés lesz. (Eddig is az volt, csak nem látszott.) Ez a kifejezés: (2 - (-4))2 - (-4)3, ami pontosan 100.

Mint látható, ebben rejlik a nyelv "költőisége", aminek persze hatalmas előnye, hogy a programozó a hirtelen nyakába szakadt költői szabadsággal élve szinte tetszőleges művésziességgel definiálhat konstansokat a más nyelvekből ismert kötött (és néha unalmas) formalizmus helyett.

Értékadások

No voltak ezek a konstansok. Mit lehetne kezdeni velük? Nos, vessünk egy pillantást az alábbi két utasításra: "You lying stupid fatherless big smelly half-witted coward!" (Te hazug buta apátlan nagy bűzlő féleszű nyápic!) és "You are as stupid as the difference between a handsome rich brave hero and thyself!" (Olyan buta vagy, mint egy jóképű gazdag bátor hős és tenmagad különbsége!).

Az első utasítás egyszerű: egy második személyű névmás, melyet egy szám követ. Ennek a hatása az, hogy az a szereplő értékül kapja a számot (jelen esetben a -64 értéket), akihez a beszéd szól.

A második eset kissé bonyolultabb. Mi lehet a "thyself" (tenmagad) értéke? Ez egy reflexív névmás, amely annak a szereplőnek az értékét jelenti, aki a megszólítás címzettje. Így tehát a második utasításban szereplő érték 8 - X, ahol X a névmás által hivatkozott szereplő értéke. Az ember az angol nyelvismeretét felhasználva sejtheti tehát, hogy a második utasítás is egy értékadás, ami "emészthetőbb" formában így néz ki: "X := 8 - X". Ha bárki "as bad as" (olyan rossz, mint), "as good as" (olyan jó, mint), vagy "as ... as" (olyan ..., mint), bármilyen melléknévvel a ... helyett azt jelenti, hogy a hivatkozott valaki egyenlő azzal a valamivel, ami a "mint" után szerepel.

Kiíratás

A Hello World programban felhasznált utasítások másik típusa a kiíratáshoz fűződik. Ezen belül is kétféle mondattípus szerepel: "Open your heart" (nyisd meg a szíved) és "Speak your mind" (mondd el a gondolatod). Az első típus eredménye a hivatkozott szereplő értékének kiírása numerikus formában, a másik esetben viszont a szereplő számértékének a számítógépen használt karakterkészlet szerinti karakter megfelelője.

Ebben a példaprogramban csak a második megjelenési formát használjuk, mivel csak szöveget kell kiírni. Így az egész program számkonstrukciók és azok kiírásának egy hosszú szekvenciája.