A BASIC nyelv
Az aukimi klasszikus BASIC nyelvjárása: típusok, struktúrák, a két rövidítés, és a szabályok, amelyek mindenkit elkapnak. 2237 parancs áll mögötte.
Egy mondatban#
Az Aukimi egy klasszikus BASIC nyelvjárást szállít: egy teljes nyelvet,
nem egy játék makrórendszert, típusos numerikus értékekkel, rekordokkal,
metódusokkal, referenciákkal, strukturált hibákkal, korutinokkal és WebGPU
compute-tal. Az Engine TXT nézetablak-módjában él, és a szkriptszerkesztő
BASIC nézetében.
A JavaScript marad a kanonikus szkriptelési API. A BASIC egy opcionális frontend: mindkettő ugyanabba a privát diszpécserbe fordítódik, így egy BASIC program és egy JavaScript program pontosan ugyanazt a motort éri el. Semmi nem másodrangú, és semmi nem egy külön futtatókörnyezet.
A szabály, amely mindenkit elkap#
Egy parancshívás mindig zárójeleket visel.
mode = ClipSpaceMode()
SpritePosition(player, 320, 180)
Ez nem stílus kérdése. Ez az, ami lehetővé teszi a fordítónak, hogy megkülönböztessen egy parancsot egy változótól, és ez az oka annak, hogy egy elgépelést most már fordítási időben elkapnak:
| Amit írsz | Mi történt régen | Mi történik most |
|---|---|---|
SpritePositon(1, 10, 20) | tisztán lefordult, a sprite nem mozdult, és a hiba később bukkant fel ... is not defined formában | fordítási hiba, a legközelebbi katalogizált helyesírás javasolt |
Blorp(1, 2) | szó szerint továbbadva a generált JavaScriptbe | fordítási hiba |
ceci nest pas du basic | utasításként lett kiadva | fordítási hiba |
Egy írási hiba régen motorhibaként mutatkozott meg. A 84 demóból álló korpuszon mérve az őr nulla téves pozitívumot produkált, és két valódi néma hibát talált, a
SetMusicSystemVolume-ot és aGetLightSensorExists-t, amelyeket a katalógus csakMusicSystemVolume-ként ésLightSensorExists-ként ismer.
Két rés szándékosan nyitva marad: a console.log("x") és a window.x = 1
továbbra is átmegy. Egy őr ezekhez meg lett írva, lemérve, és visszavonva:
a BASIC egy olyan kontextusban fut, amely olyan neveket szolgáltat, amelyeket
a fordító nem tud felsorolni, így egy ismeretlen gyökér elutasítása érvényes
programokat is elutasított volna. Egy téves pozitívum ott rosszabb, mint a
rés.
A Print rajzol. A Console naplóz.#
A leggyakoribb meglepetés:
Print(...) | a képernyőre rajzol, és egy program minden képkockán meghívja |
Console(...) | a szerkesztő konzoljára ír, és semmi mást nem csinál |
Debug(...) | ugyanaz a parancs a PureBasic neve alatt, a beidegződés kedvéért |
ConsoleWarning, ConsoleError, ClearConsole | a napló többi része |
A Print egy képkockaciklusban bármilyen valódi hibát elfojtana a
konzolban, ezért a kettő külön parancs, nem egy jelzővel ellátott.
Típusok#
A numerikus típusok valódiak, és minden célon azonosan viselkednek: a szerkesztőben, a HTML-exportban és a Bevy/natív buildben.
- Előjeles és előjel nélküli 8, 16, 32 és 64 bites egészek, determinisztikus
kényszerítéssel, egész
DIV-vel, és túlcsordulásos overflow-val. - float32 és float64.
- A klasszikus sigilek továbbra is működnek: a
name$egy string, aspeed#egy float.
Az OPTION EXPLICIT opcionálisan bekapcsolható, és a klasszikus implicit
változók maradnak az alapértelmezettek, így az importált programok tovább
futnak. A bekapcsolása az előfeltétele annak a két funkciónak, amely nem
lehet biztonságos nélküle, a numerikus típusosságnak és a referenciáknak,
mert egy elgépelt értékadás, amely csendben létrehoz egy változót, mindkettőt
meghiúsítja.
Struktúrák#
Rekordok#
A TYPE egy rekordot deklarál. Tetszőlegesen egymásba ágyazhatók, és
érték-szemantikájuk van: egy hozzárendelés mélymásolatot készít, beleértve
a beágyazott tömböket és gyűjteményeket is.
Metódusok#
A METHOD egy függvényt köt egy példányhoz, a SELF-fel belül, a New-val
konstruáláshoz és a Delete-vel megsemmisítéshez. A mélymásolatok
metódusbiztosak maradnak.
Referenciák#
A REF és a BYREF ugyanaz a dolog két írásmóddal, és mindkettő egy élő
olvasható/írható paramétert ad, egy skalárhoz, egy rekordhoz, egyetlen
mezőhöz, egy tömbhöz, egy listakurzorhoz vagy egy map-bejegyzéshez. A
referenciák tovább terjednek a hívásokon keresztül, és fix szélességű
típusokká kényszerülnek a határon.
Handle-ök#
A @target egy elsőrendű referenciát vesz fel. A HANDLE és a POINTER a
típusos formák, ellenőrzött olvasással, írással, érvényességgel és
felszabadítással, és egy törölt rekordra mutató handle érvénytelenítve van,
nem hagyva lógva.
Vezérlés és biztonság#
Strukturált hibák: TRY / CATCH / FINALLY, egymásba ágyazva, THROW-val,
védett RETHROW-val, és strukturált és string alapú elkapással egyaránt.
Feltételes fordítás: #IF / #ELSEIF / #ELSE / #ENDIF, egymásba
ágyazva, feature flag-ekkel és explicit profilokkal a szerkesztőhöz, a
HTML-hez, a Bevyhez, a natív/wasmhoz és a debug/release-hez. Az include-ok
előtt oldódik fel, minden célon.
Gazdag függvények: alapértelmezett értékek, OPTIONAL, egy záró
PARAMARRAY (vagy ...), biztonságos aritásos túlterhelések, típusos
visszatérési kényszerítés, és klónozott rekord- és tömb-visszatérések.
Több fájlos programok#
A #INCLUDE, a #INSERT és az IncludeFile több fájlossá teszi a
programot. A szerkesztő projektmodulokat hoz létre és importál, kiegészíti az
include-útvonalakat, megtartja a függőségi gráfot, és minden futtatási cél be
van kötve rá.
Korutinok, és ami szándékosan kimaradt#
A kooperatív feladatok címke-alapúak, típusos handle-ökkel, eredmény- és hibaállapottal, yield-eknél történő megszakítással, és egy taskra vagy egy csoportra váró awaitokkal. Minden célon osztoznak a játékütemezőn.
A megosztott memóriájú szálak szándékosan ki vannak zárva. Nem "még nem", kizárva. Egy kooperatív ütemező, amelyről gondolkodni lehet, jobb, mint egy adatverseny, amelyet nem lehet reprodukálni.
WebGPU compute#
Típusos f32 / i32 / u32 storage bufferek, nyers WGSL pipeline-ok,
képkocka-sorrendben történő dispatch és memblock visszaolvasás, valódi GPU
compute BASIC-ből.
⚠️ Csak Engine. A HTML cél egy explicit képességhibát dob, és a Bevy cél a kompatibilitási hiányt a build előtt jelenti, ahelyett hogy egy olyan binárist állítana elő, amely az első dispatch-nál elhasal.
Két rövidítés ugyanarra a problémára#
A parancsok 597-e Set/Get<Object><Property> néven van elnevezve:
Sprite 66, Tween 58, Text 32, Edit 29. Az objektum neve a függvénynéven belül
van, az id-je pedig minden sor első argumentuma. Mindkét lenti rövidítés
eltünteti ezt az ismétlést, és egyik sem egy új API: a fordító újraépíti a
valódi parancsnevet, és megkeresi azt a katalógusban.
WITH <family>, egy blokkon belül#
WITH SPRITE s
\position 100, 200 ` SpritePosition(s, 100, 200)
\size 64, 64 ` SpriteSize(s, 64, 64)
x# = \x ` SpriteX(s)
ENDWITH
Egy utasítás elején a \prop ír; máshol olvas. A pozíció dönt, így
nincs egy második jelölésmód, amit meg kellene tanulni. A WITH hero, egyetlen
token, még mindig a rekordblokk; a WITH SPRITE s egy katalóguscsaládot
választ ki.
s.position(...), mindenhol máshol#
s = CreateSprite(img) ` the family is DEDUCED from the creation command
s.position(100, 200) ` SpritePosition(s, 100, 200)
s.visible = 1 ` SpriteVisible(s, 1)
x# = s.x ` SpriteX(s)
A család a Create<F> / Load<F> / Clone<F>-ból származik, vagy egy
explicit s AS Sprite-ból, amikor az id máshonnan érkezik. Csak azok a
változók íródnak át, amelyeknek a családja ismert: a rekordok megtartják
a mezőiket, a listák a metódusaikat, a SELF.field érintetlen marad.
⚠️ Egy típusos paramétert nem ismer fel. A FUNCTION move(s AS Sprite)
nem ad családot az s-nek, az elemzés csak utasításszintű deklarációkat és
értékadásokat olvas. Ez itt azért van megemlítve, mert ez egy valódi korlát,
nem egy hiba, amire vadászni kellene.
⚠️ A katalógus elhagyja az igét a tulajdonságokon, és megtartja az
életciklus-parancsokon. A SpritePosition ír, a SpriteX olvas, és egyik
sem hordoz Set-et vagy Get-et: 4 parancs van a teljes katalógusban,
amely Set-tel kezdődik, és egy sem kezdődik Get-tel. Az ige ott
marad, ahol valami létrejön vagy véget ér: CreateSprite, LoadImage,
DeleteSprite.
Ezt érdemes tudni, mert egy elgépelés fordítási hiba, és a Set… az az
elgépelés, amivel az emberek érkeznek. A katalógus a tekintély, és
a referencia belőle van generálva.
Stringinterpoláció, opcionálisan#
Print($"score: {points}") ` "score: " + Str(points)
A {{ és a }} szó szerinti kapcsos zárójeleket ír.
⚠️ A $ előtag kötelező, és nem díszítés. Minden literál interpolálása
eltörte volna a kézzel írt JSON-t, amit a world API rutinszerűen fogad:
CreateTerrain("island", "{\"preset\":\"island\",\"size\":256}")
Ott a kapcsos zárójelek adatok, nem helyek. Egy előtag nélküli string érintetlen marad, bármit is tartalmaz.
A megnevezés az, ami megjelenít#
Egy klasszikus program több száz objektumot hoz létre. Csak azok, amelyeket
MEGNEVEZ, kerülnek be a Scene Graph-ba, a SpriteName(id, "player") és a
testvérei azok, amelyek egy objektumot a fába helyeznek, ahol az Engine
többi része láthatja. A LightName és a ParticlesName ugyanezt teszi egy
fénnyel és egy emitterrel.
A Nevezd meg, amit a programod létrehoz oktatóanyag végigvezet rajta: ugyanaz a jelenet, egyszer üres fával, egyszer három bejegyzéssel benne.
A parancskatalógus#
2237 parancs, 2550 nyilvános túlterhelés, 43 kategória. A legnagyobbak:
| 3D | 286 | Studio | 106 | File | 61 |
| Core | 200 | Input | 95 | Memblock | 43 |
| Tweening | 149 | Input-Raw | 94 | 3D Particles | 41 |
| 3D Physics | 144 | Multiplayer | 91 | World | 40 |
| Sprite | 135 | Text | 68 | Particles | 38 |
| Platform | 111 | 2D Physics | 66 | Sound | 37 |
plusz JSON (36), Image (35), Skeleton (34), XML (34), Music (29), Preference (27), Extras (21), HTTP (21), String (21), Math (19), Regular Expression (19), Video (18), Dictionary (17), Benchmarking (15), Compute (14), Date (13), Maths (12), Time (12), StringBuilder (9), Compression (7), Font (8), Error (4), Array (3), Cipher (2), Sort (2).
A Studio és a Compute az Aukimi saját hozzáadásai a klasszikus nyelvjáráshoz: a konzolparancsok, az objektum-megnevezés és a WebGPU pipeline.
A teljes parancsreferencia mindegyiket felsorolja, minden paraméterrel és minden túlterheléssel, saját kereséssel, ugyanabból a katalógusból generálva, amelyet ez az oldal számol, így nem maradhat le mögötte. A szerkesztő saját API panelje is azt a katalógust olvassa.
Ez az oldal a nyelvet dokumentálja; az a másik a parancsokat.
Korlátok és gyakori buktatók#
- A zárójelek nem opcionálisak egy parancson. A csupasz PureBasic forma
(
Debug "x") elutasításra kerül, mert újranyitná a változó/parancs kétértelműséget, amelytől a fordítási idejű őr függ. - Egy felhasználói függvény felülír egy azonos nevű katalogizált parancsot, és egy változó megoszthatja egy parancs nevét egy típusos deklarációban, egy értékadás bal oldalán, vagy egy útvonal gyökereként.
- A változók és a felhasználói függvények kis- és nagybetűre nem érzékenyek, és a szimbólumtereik valóban elkülönülnek a katalógusétól.
- A
Printnem napló. Lásd fent; ez az a hiba, amely megtölti a konzolt. - A Compute nem exportál. Írd meg a tartalék útvonalat, mielőtt rá hagyatkoznál.