The BASIC language

aukimin klassinen BASIC-murre: tyypit, rakenteet, kaksi oikotietä ja säännöt, jotka jäävät kaikilta kiinni. Takana 2 237 komentoa.

Yhdellä lauseella#

Aukimi tarjoaa klassisen BASIC-murteen: täyden kielen, ei leikkimakro- järjestelmää, jossa on tyypitetyt numeeriset arvot, tietueet, metodit, viittaukset, jäsennellyt virheet, korutiinit ja WebGPU-laskenta. Se asuu Enginen TXT-näyttöikkunatilassa ja skriptieditorin BASIC-näkymässä.

JavaScript pysyy skriptaus-API:n kanoninen muoto. BASIC on valinnainen etupää: molemmat kääntyvät samaksi yksityiseksi välittäjäksi, joten BASIC- ohjelma ja JavaScript-ohjelma tavoittavat tasan saman moottorin. Mikään ei ole toisen luokan kansalainen, eikä mikään ole erillinen ajonaikainen ympäristö.

Sääntö, joka jää kaikilta kiinni#

Komentokutsu kantaa aina sulkeet mukanaan.

mode = ClipSpaceMode()
SpritePosition(player, 320, 180)

Tämä ei ole tyylikysymys. Se on se, mikä antaa kääntäjän erottaa komennon muuttujasta, ja siksi kirjoitusvirhe jää nykyään kiinni jo käännösvaiheessa:

KirjoitatMitä ennen tapahtuiMitä tapahtuu nyt
SpritePositon(1, 10, 20)kääntyi puhtaasti, sprite ei liikkunut, ja virhe paljastui myöhemmin muodossa ... is not definedkäännösvirhe, jossa ehdotetaan lähintä luetteloitua kirjoitusasua
Blorp(1, 2)välitettiin sellaisenaan generoituun JavaScriptiinkäännösvirhe
ceci nest pas du basictulostui lauseenakäännösvirhe

Kirjoitusvirhe näyttäytyi ennen moottorin bugilta. Mitattuna 84 demon aineistoa vasten, vartija tuotti nolla väärää hälytystä ja löysi kaksi todellista hiljaista virhettä, SetMusicSystemVolume ja GetLightSensorExists, jotka luettelo tuntee vain nimillä MusicSystemVolume ja LightSensorExists.

Kaksi vuotoa on jätetty tarkoituksella auki: console.log("x") ja window.x = 1 läpäisevät yhä. Vartija näille kirjoitettiin, mitattiin ja vedettiin pois: BASIC toimii kontekstissa, joka tarjoaa nimiä, joita kääntäjä ei pysty luettelemaan, joten tuntemattoman juuren hylkääminen hylkäsi myös kelvollisia ohjelmia. Väärä hälytys siinä on pahempi kuin vuoto.

Yksittäinen yleisin yllätys:

Print(...)piirtää ruudulle, ja ohjelma kutsuu sitä joka ruudulla
Console(...)kirjoittaa editorin konsoliin, eikä tee muuta
Debug(...)sama komento PureBasicin nimellä, lihasmuistia varten
ConsoleWarning, ConsoleError, ClearConsoleloput lokista

Print ruutuluupissa hukuttaisi minkä tahansa oikean virheen konsoliin, ja juuri siksi nämä kaksi ovat erilliset komennot yhden lipullisen komennon sijaan.

Tyypit#

Numeeriset tyypit ovat todellisia, ja ne käyttäytyvät identtisesti jokaisella kohteella, editorissa, HTML-viennissä ja Bevy/natiivi-buildissa:

  • Etumerkilliset ja etumerkittömät 8-, 16-, 32- ja 64-bittiset kokonaisluvut, determinististisellä pakotuksella, kokonaislukujaolla DIV, ja wrappaavalla ylivuodolla.
  • float32 ja float64.
  • Klassiset sigilit toimivat yhä: name$ on merkkijono, speed# on liukuluku.

OPTION EXPLICIT on opt-in, ja klassiset implisiittiset muuttujat pysyvät oletuksena, jotta tuodut ohjelmat toimivat yhä. Sen päälle kytkeminen on edellytys kahdelle ominaisuudelle, jotka eivät voi olla turvallisia ilman sitä, numeeriselle tyypitykselle ja viittauksille, koska väärinkirjoitettu sijoitus, joka hiljaa luo muuttujan, kaataa molemmat.

Rakenteet#

Tietueet#

TYPE julistaa tietueen. Ne sisäkkäistyvät mielivaltaisesti, ja niillä on arvosemantiikka: yhden sijoittaminen kopioi sen syvästi, sisäkkäiset taulukot ja kokoelmat mukaan lukien.

Metodit#

METHOD sitoo funktion instanssiin, SELF sen sisällä, New rakentaa ja Delete tuhoaa. Syväkopiot pysyvät metoditurvallisina.

Viittaukset#

REF ja BYREF ovat sama asia kahdella kirjoitusasulla, ja molemmat antavat elävän luku/kirjoitusparametrin, skalaarille, tietueelle, yksittäiselle kentälle, taulukolle, listakursorille tai map-merkinnälle. Viittaukset kulkevat kutsujen läpi, ja pakottuvat kiinteän leveyden tyypeiksi rajalla.

Kahvat#

@target ottaa ensiluokkaisen viittauksen. HANDLE ja POINTER ovat tyypitetyt muodot, tarkistetulla luvulla, kirjoituksella, kelvollisuudella ja vapautuksella, ja kahva poistettuun tietueeseen mitätöityy sen sijaan, että se jäisi roikkumaan.

Ohjaus ja turvallisuus#

Jäsennellyt virheet: TRY / CATCH / FINALLY, sisäkkäisinä, THROWilla, suojatulla RETHROWilla, ja sekä jäsenneltyinä että merkkijonopohjaisina kiinniottoina.

Ehdollinen kääntäminen: #IF / #ELSEIF / #ELSE / #ENDIF, sisäkkäisinä, ominaisuuslipuilla ja nimenomaisilla profiileilla editorille, HTML:lle, Bevylle, natiivi/wasm-kohteelle ja debug/release-tilalle. Se ratkaistaan ennen sisällytyksiä, jokaisella kohteella.

Rikkaat funktiot: oletusarvot, OPTIONAL, viimeinen PARAMARRAY (tai ...), turvalliset arity-ylikuormat, tyypitetty paluuarvon pakotus, sekä kloonatut tietue- ja taulukkopaluuarvot.

Monitiedosto-ohjelmat#

#INCLUDE, #INSERT ja IncludeFile tekevät ohjelmasta useita tiedostoja. Editori luo ja tuo projektimoduuleja, täydentää sisällytyspolkuja, pitää riippuvuusgraafin, ja jokainen ajonaikainen kohde on kytketty sitä varten.

Korutiinit, ja se asia, joka jätettiin tarkoituksella pois#

Yhteistyöskentelevät tehtävät ovat label-pohjaisia, tyypitetyillä kahvoilla, tulos- ja virhetilalla, peruutuksella yield-kohdissa, ja odotuksilla yhdelle tehtävälle tai ryhmälle. Ne jakavat pelin ajastimen jokaisella kohteella.

Säikeet jaetulla muistilla on tarkoituksella jätetty pois. Ei "ei vielä", vaan jätetty pois. Ajastin, jota voi jäsentää, voittaa datakisan, jota ei voi toistaa.

WebGPU-laskenta#

Tyypitetyt f32 / i32 / u32 -tallennuspuskurit, raa'at WGSL-putket, ruutujärjestyksessä lähetetty dispatch ja memblock-takaisinluku, todellinen GPU-laskenta BASICista.

⚠️ Vain Engine. HTML-kohde nostaa selkeän kyvykkyysvirheen, ja Bevy-kohde raportoi yhteensopimattomuuden ennen buildia sen sijaan, että se tuottaisi binäärin, joka epäonnistuu ensimmäisessä dispatchissa.

Kaksi oikotietä samaan ongelmaan#

597 komennosta on nimetty Set/Get<Object><Property>: Sprite 66, Tween 58, Text 32, Edit 29. Objektin nimi on funktion nimen sisällä ja sen id on joka rivin ensimmäinen argumentti. Molemmat alla olevat oikotiet poistavat tuon toiston, eikä kumpikaan ole uusi API: kääntäjä rakentaa oikean komennon nimen uudelleen ja hakee sen luettelosta.

WITH <perhe>, lohkon sisällä#

WITH SPRITE s
  \position 100, 200      ` SpritePosition(s, 100, 200)
  \size 64, 64            ` SpriteSize(s, 64, 64)
  x# = \x                 ` SpriteX(s)
ENDWITH

Lauseen alussa \prop kirjoittaa; muualla se lukee. Sijainti päättää, joten toista notaatiota ei tarvitse opetella. WITH hero, yksi tokeni, on yhä tietuelohko; WITH SPRITE s valitsee luetteloperheen.

s.position(...), kaikkialla muualla#

s = CreateSprite(img)     ` perhe PÄÄTELLÄÄN luontikomennosta
s.position(100, 200)      ` SpritePosition(s, 100, 200)
s.visible = 1             ` SpriteVisible(s, 1)
x# = s.x                  ` SpriteX(s)

Perhe tulee komennoista Create<F> / Load<F> / Clone<F>, tai nimenomaisesta s AS Sprite -lausekkeesta, kun id saapuu muualta. Vain muuttujat, joiden perhe on tunnettu, kirjoitetaan uudelleen: tietueet pitävät kenttänsä, listat pitävät metodinsa, SELF.field pysyy koskemattomana.

⚠️ Tyypitettyä parametria ei tunnisteta. FUNCTION move(s AS Sprite) ei anna s:lle perhettä, kulku lukee vain lauseentason julistuksia ja sijoituksia. Tämä on mainittu tässä, koska se on todellinen rajoitus, ei bugi, jota pitäisi metsästää.

⚠️ Luettelo pudottaa verbin ominaisuuksista ja säilyttää sen elinkaaressa. SpritePosition kirjoittaa, SpriteX lukee, eikä kumpikaan kanna Set- tai Get-etuliitettä: koko luettelossa 4 komentoa alkaa sanalla Set, ja yksikään ei ala sanalla Get. Verbi säilyy siellä, missä jokin syntyy tai päättyy: CreateSprite, LoadImage, DeleteSprite.

Tämä kannattaa tietää, koska kirjoitusvirhe on käännösvirhe, ja Set... on se kirjoitusvirhe, jonka kanssa ihmiset saapuvat. Luettelo on auktoriteetti, ja viiteopas on generoitu siitä.

Merkkijonon interpolointi, opt-in#

Print($"score: {points}")        ` "score: " + Str(points)

{{ ja }} kirjoittavat kirjaimelliset aaltosulkeet.

⚠️ $-etuliite on pakollinen, eikä se ole koristelua. Jokaisen kirjaimellisen merkkijonon interpolointi rikkoi käsin kirjoitetun JSON:in, jota maailma-API käyttää rutiininomaisesti:

CreateTerrain("island", "{\"preset\":\"island\",\"size\":256}")

Siellä aaltosulkeet ovat dataa, eivät reikiä. Etuliitteetön merkkijono jätetään koskemattomaksi, sisälsipä se mitä tahansa.

Nimeäminen on näyttämistä#

Klassinen ohjelma tekee satoja objekteja. Vain ne, jotka se NIMEÄÄ, päätyvät Scene Graphiin, SpriteName(id, "player") ja sen sisarukset ovat se, mikä laittaa objektin puuhun, jossa loppu Enginestä näkee sen. LightName ja ParticlesName tekevät saman valolle ja emitterille.

Opetusohjelma Name what your program creates käy sen läpi: sama kohtaus, kerran tyhjällä puulla ja kerran kolmella merkinnällä.

Komentoluettelo#

2 237 komentoa, 2 550 julkista overloadia, 43 kategoriaa. Suurimmat:

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

plus 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 ja Compute ovat aukimin omia lisäyksiä klassiseen murteeseen: konsolikomennot, objektien nimeäminen, ja WebGPU-putki.

Täydellinen komentoviite listaa ne kaikki, jokaisen parametrin ja jokaisen ylikuormituksen kanssa, ja omalla haullaan, generoituna samasta luettelosta, jota tämä sivu laskee, joten se ei voi jäädä siitä jälkeen. Editorin oma API-paneeli lukee myös sitä samaa luetteloa.

Tämä sivu dokumentoi kielen; tuo sivu dokumentoi komennot.

Rajoitukset ja yleiset sudenkuopat#

  • Sulkeet eivät ole valinnaisia komennossa. Paljas PureBasic-muoto (Debug "x") hylätään, koska se avaisi uudelleen muuttuja/komento- epäselvyyden, josta käännösaikainen vartija riippuu.
  • Käyttäjän funktio voittaa samannimisen luetteloidun komennon, ja muuttuja voi jakaa komennon nimen tyypitetyssä julistuksessa, sijoituksen vasemmalla puolella, tai polun juurena.
  • Muuttujat ja käyttäjän funktiot ovat kirjainkoosta riippumattomia, ja niiden symbolitilat ovat aidosti erillisiä luettelon symbolitilasta.
  • Print ei ole loki. Katso yllä; se on virhe, joka täyttää konsolin.
  • Compute ei vie ulos. Kirjoita varapolku ennen kuin luotat siihen.