BASIC-språket
aukimis klassiske BASIC-dialekt, typer, strukturer, de to snarveiene, og reglene som fanger alle. 2 237 kommandoer bak den.
På én linje#
Aukimi følger med en klassisk BASIC-dialekt: et fullt språk, ikke et
lekemakrosystem, med typede tall, poster, metoder, referanser, strukturerte
feil, korutiner og WebGPU-kompute. Den lever i Engines TXT-viewportmodus og
i skripteditorens BASIC-visning.
JavaScript forblir det kanoniske skript-API-et. BASIC er et valgfritt frontend: begge kompilerer til den samme private dispatcheren, så et BASIC-program og et JavaScript-program når nøyaktig den samme motoren. Ingenting er annenrangs, og ingenting er en egen runtime.
Regelen som fanger alle#
Et kommandokall bærer alltid parenteser.
mode = ClipSpaceMode()
SpritePosition(player, 320, 180)
Dette er ikke stil. Det er det som lar kompilatoren skille en kommando fra en variabel, og det er hvorfor en skrivefeil nå fanges ved kompilering:
| Du skriver | Hva som pleide å skje | Hva som skjer nå |
|---|---|---|
SpritePositon(1, 10, 20) | kompilerte rent, spriten flyttet seg ikke, og feilen dukket opp senere som ... is not defined | kompileringsfeil, med det nærmeste katalogiserte navnet foreslått |
Blorp(1, 2) | videresendt uendret inn i den genererte JavaScript-en | kompileringsfeil |
ceci nest pas du basic | sendt ut som en setning | kompileringsfeil |
En skrive-feil pleide å fremstå som en motor-feil. Målt mot demokorpuset på 84 demoer, ga vaktposten null falske positiver og fant to reelle stille feil,
SetMusicSystemVolumeogGetLightSensorExists, som katalogen bare kjenner somMusicSystemVolumeogLightSensorExists.
To lekkasjer er bevisst latt stå åpne: console.log("x") og window.x = 1
slipper fortsatt gjennom. En vaktpost for dem ble skrevet, målt og
trukket tilbake: BASIC kjører inne i en kontekst som leverer navn
kompilatoren ikke kan liste opp, så å avvise en ukjent rot avviste også
gyldige programmer. En falsk positiv der er verre enn lekkasjen.
Print tegner. Console logger.#
Den vanligste overraskelsen:
Print(...) | tegner på skjermen, og et program kaller den hver ramme |
Console(...) | skriver til editorens konsoll, og gjør ingenting annet |
Debug(...) | den samme kommandoen under PureBasics navn, for muskelminnet |
ConsoleWarning, ConsoleError, ClearConsole | resten av loggen |
Print i en rammesløyfe ville druknet enhver reell feil i konsollen, som er
hvorfor de to er separate kommandoer i stedet for én med et flagg.
Typer#
Numeriske typer er reelle, og de oppfører seg identisk på hvert mål, editoren, HTML-eksporten og Bevy/native-bygget:
- Fortegnede og ikke-fortegnede 8-, 16-, 32- og 64-bits heltall, med
deterministisk tvang, heltallsdivisjon
DIV, og overflyt som ruller rundt (wrapping). - float32 og float64.
- De klassiske sigilene fungerer fortsatt:
name$er en streng,speed#en float.
OPTION EXPLICIT er valgfritt å slå på, og klassiske implisitte
variabler forblir standard, så importerte programmer fortsatt kjører. Å slå
det på er forutsetningen for de to funksjonene som ikke kan være trygge uten
det, numerisk typing og referanser, fordi en feilstavet tilordning som
stille oppretter en variabel, undergraver begge.
Strukturer#
Poster (records)#
TYPE erklærer en record. De nøster vilkårlig, og de har
verdisemantikk: å tilordne én dyp-kopierer den, inkludert nøstede
arrayer og samlinger.
Metoder#
METHOD binder en funksjon til en instans, med SELF inni den, New for
å konstruere og Delete for å ødelegge. Dype kopier forblir metode-trygge.
Referanser#
REF og BYREF er den samme tingen under to stavemåter, og begge gir en
levende lese/skrive-parameter, for en skalar, en record, ett enkelt felt, en
array, en listemarkør eller en map-oppføring. Referanser videreføres gjennom
kall, og tvinges til fastbredde-typer ved grensen.
Håndtak (handles)#
@target tar en førsteklasses referanse. HANDLE og POINTER er de typede
formene, med sjekket lesing, skriving, gyldighet og frigivelse, og et
håndtak til en slettet record blir ugyldiggjort i stedet for å bli hengende.
Kontroll og sikkerhet#
Strukturerte feil: TRY / CATCH / FINALLY, nøstet, med THROW,
beskyttet RETHROW, og både strukturerte og streng-baserte fangster.
Betinget kompilering: #IF / #ELSEIF / #ELSE / #ENDIF, nøstet, med
feature-flagg og eksplisitte profiler for editoren, HTML, Bevy, native/wasm
og debug/release. Den løses før includes, på hvert mål.
Rike funksjoner: standardverdier, OPTIONAL, en avsluttende
PARAMARRAY (eller ...), trygge arity-overloads, typet returtvang, og
klonede record- og array-returer.
Flerfils-programmer#
#INCLUDE, #INSERT og IncludeFile gjør et program om til flere filer.
Editoren oppretter og importerer prosjektmoduler, fullfører include-stier,
holder styr på avhengighetsgrafen, og hvert kjøretidsmål er koblet til det.
Korutiner, og det som er bevisst utelatt#
Kooperative oppgaver er label-baserte, med typede håndtak, en resultat- og feiltilstand, kansellering ved yields, og awaits på én oppgave eller en gruppe. De deler spillplanleggeren på hvert mål.
Tråder med delt minne er bevisst utelatt. Ikke «ikke ennå», utelatt. En kooperativ planlegger du kan resonnere om, slår en datakappløping du ikke kan reprodusere.
WebGPU-kompute#
Typede f32 / i32 / u32 storage-buffere, rå WGSL-pipelines,
ramme-ordnet dispatch og memblock-tilbakelesing, ekte GPU-kompute fra BASIC.
⚠️ Bare Engine. HTML-målet kaster en eksplisitt kapasitetsfeil, og Bevy-målet rapporterer inkompatibiliteten før bygget i stedet for å produsere en binærfil som feiler ved første dispatch.
To snarveier for det samme problemet#
597 av kommandoene er navngitt Set/Get<Object><Property>: Sprite 66,
Tween 58, Text 32, Edit 29. Objektets navn er inne i funksjonsnavnet, og
id-en dets er det første argumentet på hver linje. Begge snarveiene under
fjerner den repetisjonen, og ingen av dem er et nytt API: kompilatoren bygger
opp igjen det virkelige kommandonavnet og slår det opp i katalogen.
WITH <family>, inne i en blokk#
WITH SPRITE s
\position 100, 200 ` SpritePosition(s, 100, 200)
\size 64, 64 ` SpriteSize(s, 64, 64)
x# = \x ` SpriteX(s)
ENDWITH
I hodet av en setning skriver \prop; hvor som helst ellers leser
den. Posisjonen avgjør, så det finnes ingen annen notasjon å lære. WITH hero, ett token, er fortsatt record-blokken; WITH SPRITE s velger en
katalogfamilie.
s.position(...), overalt ellers#
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)
Familien kommer fra Create<F> / Load<F> / Clone<F>, eller fra en
eksplisitt s AS Sprite når id-en ankommer et annet sted fra. Bare
variabler hvis familie er kjent, blir skrevet om: records beholder
feltene sine, lister beholder metodene sine, SELF.field røres ikke.
⚠️ En typet parameter blir ikke gjenkjent. FUNCTION move(s AS Sprite)
gir ikke s en familie, gjennomgangen leser bare setningsnivå-erklæringer
og tilordninger. Sagt her fordi det er en reell begrensning, ikke en bug du
bør jakte på.
⚠️ Katalogen dropper verbet på egenskaper, og beholder det på livssyklus.
SpritePosition skriver, SpriteX leser, og ingen av dem bærer et Set
eller et Get: 4 kommandoer i hele katalogen begynner med Set, og
ingen begynner med Get. Verbet overlever der noe kommer til
eksistens eller opphører: CreateSprite, LoadImage, DeleteSprite.
Det er verdt å vite fordi en skrivefeil er en kompileringsfeil, og Set… er
skrivefeilen folk kommer med. Katalogen er autoriteten, og
referansen er generert fra den.
Strenginterpolasjon, valgfri#
Print($"score: {points}") ` "score: " + Str(points)
{{ og }} skriver bokstavelige klammer.
⚠️ $-prefikset er obligatorisk, og det er ikke pynt. Å interpolere hver
literal ødela håndskrevet JSON, som verden-API-et tar rutinemessig imot:
CreateTerrain("island", "{\"preset\":\"island\",\"size\":256}")
Der er klammene data, ikke hull. En streng uten prefiks lates urørt uansett hva den inneholder.
Å navngi er å vise#
Et klassisk program lager hundrevis av objekter. Bare de det NAVNGIR
kommer inn i Scene Graph, SpriteName(id, "player") og søsknene dets er
det som setter et objekt i treet der resten av Engine kan se det.
LightName og ParticlesName gjør det samme for et lys og en emitter.
Veiledningen Navngi det programmet ditt skaper går gjennom det, den samme scenen, én gang med treet tomt og én gang med tre oppføringer i det.
Kommandokatalogen#
2 237 kommandoer, 2 550 offentlige overbelastninger, 43 kategorier. De største:
| 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 |
pluss 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).
Studio og Compute er Aukimis egne tilføyelser til den klassiske dialekten, konsoll-kommandoene, objektnavngivingen, og WebGPU-pipelinen.
Den komplette kommandoreferansen lister alle sammen, med hver parameter og hver overbelastning, og sitt eget søk, generert fra den samme katalogen denne siden teller, så den kan ikke havne bak den. Editorens eget API-panel leser den samme katalogen.
Denne siden dokumenterer språket; den andre dokumenterer kommandoene.
Begrensninger og vanlige fallgruver#
- Parenteser er ikke valgfrie på en kommando. Den bare PureBasic-formen
(
Debug "x") avvises, fordi den åpner igjen variabel/kommando-tvetydigheten som vaktposten ved kompilering er avhengig av. - En brukerfunksjon vinner over en katalogisert kommando med samme navn, og en variabel kan dele navn med en kommando i en typet erklæring, på venstre side av en tilordning, eller som roten av en sti.
- Variabler og brukerfunksjoner skiller ikke mellom store og små bokstaver, og symbolrommene deres er ekte adskilt fra katalogens.
Printer ikke en logg. Se over; det er feilen som fyller en konsoll.- Compute eksporterer ikke. Skriv reserveløsningen før du stoler på den.