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:
| Kirjoitat | Mitä ennen tapahtui | Mitä tapahtuu nyt |
|---|---|---|
SpritePositon(1, 10, 20) | kääntyi puhtaasti, sprite ei liikkunut, ja virhe paljastui myöhemmin muodossa ... is not defined | käännösvirhe, jossa ehdotetaan lähintä luetteloitua kirjoitusasua |
Blorp(1, 2) | välitettiin sellaisenaan generoituun JavaScriptiin | käännösvirhe |
ceci nest pas du basic | tulostui lauseena | kää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ä,
SetMusicSystemVolumejaGetLightSensorExists, jotka luettelo tuntee vain nimilläMusicSystemVolumejaLightSensorExists.
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.
Print piirtää. Console lokittaa.#
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, ClearConsole | loput 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:
| 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 |
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.
Printei ole loki. Katso yllä; se on virhe, joka täyttää konsolin.- Compute ei vie ulos. Kirjoita varapolku ennen kuin luotat siihen.