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 skriverHva som pleide å skjeHva som skjer nå
SpritePositon(1, 10, 20)kompilerte rent, spriten flyttet seg ikke, og feilen dukket opp senere som ... is not definedkompileringsfeil, med det nærmeste katalogiserte navnet foreslått
Blorp(1, 2)videresendt uendret inn i den genererte JavaScript-enkompileringsfeil
ceci nest pas du basicsendt ut som en setningkompileringsfeil

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, SetMusicSystemVolume og GetLightSensorExists, som katalogen bare kjenner som MusicSystemVolume og LightSensorExists.

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.

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, ClearConsoleresten 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:

3D286Studio106File61
Core200Input95Memblock43
Tweening149Input-Raw943D Particles41
3D Physics144Multiplayer91World40
Sprite135Text68Particles38
Platform1112D Physics66Sound37

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.
  • Print er ikke en logg. Se over; det er feilen som fyller en konsoll.
  • Compute eksporterer ikke. Skriv reserveløsningen før du stoler på den.