( uid_21365 | 2020. 12. 29., k – 15:19 )

Az indexek nálam is nullától számítódnak.

Na most a "kivételkezelés" szót hasonlatként alkalmaztam az előbb. Nincs itt afféle globális kivételkezelő mechanizmus mint a C++ esetén, amit amúgy nem is igazán komálok. Technikailag ez úgy működik, hogy amikor a forráskód tokenizálása történik, akkor a progi felderíti, mely utasítások előtt szerepel a safe kulcsszó, s azon utasításoknál beállít egy speciális flaget. E flag létét aztán az utasítás detektálja amikor végrehajtás adódik rá, s ettől kezdve kicsit másképp működik mint tenné amúgy: azaz, mielőtt megcsinálná ami amúgy is a dolga lenne, előbb ellenőrzi azt, valid-e az index értéke. Ha nem, elugrik a megfelelő címkére.

De még ez az elugrás se mondható olyasminek hogy ez igazi „kivétel” volna: ez teljesen normális viselkedés (legalábbis én annak tartom). Mert miért is induljunk ki abból, hogy indexhatárátlépés csak valami tévedés vagy hiba következtében történhetett? Simán lehet például olyasmi is, hogy van egy ciklus aminél azonban nem lehet tudni előre, meddig fog lefutni, ugyanakkor mégis minden iterációnál növelni kell egy számlálót, mely számlálóval aztán indexelünk valamit.

Szóval formailag nézve ez hasonló a kivételkezeléshez (legalábbis nekem úgy tűnik) de tulajdonképpen nem az. Csak távoli analógiaként használtam ezt a szót rá.

Egyszerűen úgy találtam, az indexhatárellenőrzés majdnem mindig felesleges, s mert amúgyis sebességmániás vagyok, úgy csináltam meg a nyelvet hogy alapból ne végezzen ilyesmit. De mert számot kellett vessek azzal hogy néha mégis szükséges az indexhatárellenőrzés, ki kellett találnom valamit rá ami opcionális, mert bár ez korábban is megoldható volt, de az eddigi példaprogramjaim alapján az is nyilvánvalóvá vált, hogy a „szokásos” módszerek a kód áttekinthetőségét rontják, továbbá, a sebességük is olyan teknősbékaszerű ahhoz képest mintha natív sebességen történnének.

Volt olyan korábbi nyelvem amúgy, amiben valóban létezett igazi kivételkezelés, ott se pont olyan mint a C++ esetén szintaktikailag, de technikailag tényleg hasonlított ahhoz. Még saját kivételeket is lehetett „dobni” a programban. De minél többet törtem a fejemet rajta, annál inkább oda lyukadtam ki, hogy igazából semmi normális dologra nem lehet használni egy effélét. Zavarossá teszi még a kódot is. Többnyre úgyis az van hogy a kivételkezelő függvény azzal kell kezdje, ellenőrzi a kivételt hogy most miért is került ide a vezérlés. Szóval az ellenőrzés nem megspórolható. Hacsak nem készítünk külön kivételkezelőt minden egyes helyhez ahol kivétel adódhat, na de ha azt tesszük akkor lényegében ugyanott vagyunk mint most ahogy megcsináltam: minden ilyen „kivételnek” van egy saját címkéje amire ugorhat!

Annak sincs akadálya a Periben hogy ez a címke mindenütt ugyanaz legyen, amennyiben egyes „kivételeket” ugyanúgy akarunk lekezelni, például csak kiírni egy hibaüzenetet aztán abortálni.

Nem zárom ki amúgy, hogy van előnye a C++ kivételkezelésének is ezzel a módszerrel szemben, de az az előny igen ritkán érvényesülhet mert olvastam már róla hogy nem sokan használják és szeretik e kivételkezelést ott, sőt van arról is vita a modernebb nyelvekben hogy legyen-e egyáltalán kivételkezelés azokban, mert súlyosan elbonyolít mindent. Az biztos ha a C++ kivételkezelése tényleg olyan tuti volna, erről nem lehetne vita mert mindenhová azt építenék be vagy valami ahhoz nagyon hasonlót.

Ezt a Periben egyszerű volt megcsinálnom, s ennek örülök, mert igyekszem a kód komplexitását csökkenteni ahol csak lehet, a későbbi bővíthetőség illetve karbantarthatóság meg áttekinthetőség érdekében.