Bahasa BASIC
Dialek klasik BASIC milik aukimi: jenis, struktur, dua singkatan, dan peraturan yang menjerat semua orang. 2 237 arahan di sebaliknya.
Secara ringkas#
aukimi menawarkan satu dialek BASIC klasik: satu bahasa penuh, bukan
sistem makro mainan, dengan numerik bertaip, rekod, kaedah, rujukan, ralat
berstruktur, coroutine dan compute WebGPU. Ia hidup dalam mod viewport TXT
milik Engine dan dalam pandangan BASIC editor skrip.
JavaScript kekal sebagai API skrip yang kanonik. BASIC ialah satu frontend pilihan: kedua-duanya dikompil kepada penghantar (dispatcher) peribadi yang sama, jadi satu program BASIC dan satu program JavaScript mencapai enjin yang sama persis. Tiada apa-apa yang bertaraf kelas kedua, dan tiada apa-apa yang menjadi runtime berasingan.
Peraturan yang menjerat semua orang#
Satu panggilan arahan sentiasa membawa tanda kurung.
mode = ClipSpaceMode()
SpritePosition(player, 320, 180)
Ini bukan gaya penulisan. Inilah yang membolehkan pengkompil membezakan satu arahan daripada satu pembolehubah, dan itulah sebabnya satu kesilapan ejaan kini ditangkap semasa waktu kompilasi:
| Anda menulis | Apa yang berlaku dahulu | Apa yang berlaku sekarang |
|---|---|---|
SpritePositon(1, 10, 20) | dikompil dengan bersih, sprite itu tidak bergerak, dan kegagalan itu terserlah kemudian sebagai ... is not defined | ralat kompilasi, dengan ejaan terdekat dalam katalog dicadangkan |
Blorp(1, 2) | dihantar terus, kata demi kata, ke dalam JavaScript yang dijana | ralat kompilasi |
ceci nest pas du basic | dikeluarkan sebagai satu penyataan | ralat kompilasi |
Satu kesilapan penulisan dahulu tampil sebagai satu pepijat enjin. Diukur berdasarkan korpus 84 demo, pengawal ini menghasilkan sifar positif palsu dan menemui dua kegagalan senyap sebenar,
SetMusicSystemVolumedanGetLightSensorExists, yang katalog hanya kenali sebagaiMusicSystemVolumedanLightSensorExists.
Dua kebocoran sengaja dibiarkan terbuka: console.log("x") dan window.x = 1
masih lolos. Satu pengawal untuk keduanya telah ditulis, diukur dan
ditarik balik: BASIC berjalan di dalam satu konteks yang membekalkan
nama-nama yang tidak dapat disenaraikan oleh pengkompil, jadi menolak satu
akar yang tidak dikenali menolak juga program yang sah. Satu positif palsu di
situ lebih teruk berbanding kebocoran itu sendiri.
Print melukis. Console mencatat log.#
Kejutan paling biasa:
Print(...) | melukis pada skrin, dan satu program memanggilnya setiap bingkai |
Console(...) | menulis ke konsol editor, dan tidak melakukan apa-apa lagi |
Debug(...) | arahan yang sama di bawah nama PureBasic, untuk ingatan otot |
ConsoleWarning, ConsoleError, ClearConsole | selebihnya log itu |
Print di dalam satu gelung bingkai akan menenggelamkan sebarang ralat
sebenar dalam konsol, dan itulah sebabnya kedua-duanya adalah arahan
berasingan dan bukan satu dengan satu flag.
Jenis#
Jenis numerik adalah sebenar, dan ia berkelakuan sama persis pada setiap sasaran, editor, eksport HTML dan binaan Bevy/native:
- Integer bertanda dan tidak bertanda 8, 16, 32 dan 64-bit, dengan
koersi deterministik,
DIVinteger, dan overflow wrapping. - float32 dan float64.
- Sigil klasik masih berfungsi:
name$ialah satu string,speed#satu float.
OPTION EXPLICIT bersifat opt-in, dan pembolehubah implisit klasik kekal
sebagai lalai supaya program yang diimport masih berjalan. Menghidupkannya
adalah prasyarat untuk dua ciri yang tidak boleh selamat tanpanya, penaipan
numerik dan rujukan, kerana satu tugasan yang tersalah eja yang secara senyap
mencipta satu pembolehubah baharu menewaskan kedua-duanya.
Struktur#
Rekod#
TYPE mengisytiharkan satu rekod. Ia boleh bersarang secara sewenang-wenang,
dan ia mempunyai semantik nilai: menugaskan satu daripadanya menyalin
secara mendalam (deep-copy), termasuk array dan koleksi bersarang.
Kaedah#
METHOD mengikat satu fungsi kepada satu instance, dengan SELF di
dalamnya, New untuk membina dan Delete untuk memusnahkan. Salinan
mendalam kekal selamat untuk kaedah.
Rujukan#
REF dan BYREF adalah perkara yang sama di bawah dua ejaan, dan
kedua-duanya memberi satu parameter baca/tulis hidup, untuk satu skalar, satu
rekod, satu medan tunggal, satu array, satu kursor senarai atau satu entri
map. Rujukan diteruskan melalui panggilan, dan dikoersi kepada jenis
lebar-tetap pada sempadan.
Handle#
@target mengambil satu rujukan kelas pertama. HANDLE dan POINTER adalah
bentuk bertaip, dengan baca, tulis, kesahihan dan pelepasan yang disemak, dan
satu handle kepada rekod yang telah dipadam dibatalkan dan bukannya
ditinggalkan tergantung.
Kawalan dan keselamatan#
Ralat berstruktur: TRY / CATCH / FINALLY, bersarang, dengan
THROW, RETHROW yang dilindungi, dan tangkapan berstruktur mahupun string.
Kompilasi bersyarat: #IF / #ELSEIF / #ELSE / #ENDIF, bersarang,
dengan flag ciri dan profil eksplisit untuk editor, HTML, Bevy, native/wasm
dan debug/release. Ia diselesaikan sebelum include, pada setiap sasaran.
Fungsi kaya: nilai lalai, OPTIONAL, satu PARAMARRAY akhir (atau
...), overload arity yang selamat, koersi jenis pulangan, dan pulangan
rekod serta array yang diklonkan.
Program berbilang fail#
#INCLUDE, #INSERT dan IncludeFile menjadikan satu program berbilang
fail. Editor mencipta dan mengimport modul projek, melengkapkan laluan
include, mengekalkan graf kebergantungan, dan setiap sasaran runtime
disambungkan untuknya.
Coroutine, dan perkara yang sengaja ditinggalkan#
Tugas kooperatif berasaskan label, dengan handle bertaip, satu keadaan hasil dan ralat, pembatalan pada yield, dan await pada satu tugas atau satu kumpulan. Ia berkongsi penjadual permainan pada setiap sasaran.
Thread dengan memori dikongsi sengaja dikecualikan. Bukan "belum lagi", dikecualikan. Satu penjadual kooperatif yang boleh anda fikirkan dengan jelas mengatasi satu perlumbaan data yang tidak boleh anda ulangi.
Compute WebGPU#
Buffer storan f32 / i32 / u32 bertaip, pipeline WGSL mentah, dispatch
tersusun-bingkai dan pembacaan semula memblock, compute GPU sebenar daripada
BASIC.
⚠️ Hanya Engine. Sasaran HTML membangkitkan satu ralat keupayaan yang eksplisit, dan sasaran Bevy melaporkan ketidakserasian itu sebelum binaan dan bukannya menghasilkan satu binari yang gagal pada dispatch pertama.
Dua singkatan bagi masalah yang sama#
597 daripada arahan itu dinamakan Set/Get<Object><Property>: Sprite
66, Tween 58, Text 32, Edit 29. Nama objek itu berada di dalam nama fungsi
dan id-nya adalah argumen pertama bagi setiap baris. Kedua-dua singkatan di
bawah membuang pengulangan itu, dan tiada satu pun daripadanya adalah satu
API baharu: pengkompil membina semula nama arahan sebenar dan mencarinya
dalam katalog.
WITH <family>, di dalam satu blok#
WITH SPRITE s
\position 100, 200 ` SpritePosition(s, 100, 200)
\size 64, 64 ` SpriteSize(s, 64, 64)
x# = \x ` SpriteX(s)
ENDWITH
Pada awal satu penyataan \prop menulis; di mana-mana sahaja yang lain
ia membaca. Kedudukan yang menentukan, jadi tiada notasi kedua untuk
dipelajari. WITH hero, satu token, masih blok rekod itu; WITH SPRITE s
memilih satu family katalog.
s.position(...), di merata tempat lain#
s = CreateSprite(img) ` family itu DISIMPULKAN daripada arahan penciptaan
s.position(100, 200) ` SpritePosition(s, 100, 200)
s.visible = 1 ` SpriteVisible(s, 1)
x# = s.x ` SpriteX(s)
Family itu datang daripada Create<F> / Load<F> / Clone<F>, atau
daripada satu s AS Sprite eksplisit apabila id itu tiba dari tempat lain.
Hanya pembolehubah yang family-nya diketahui ditulis semula: rekod
mengekalkan medannya, senarai mengekalkan kaedahnya, SELF.field tidak
disentuh.
⚠️ Satu parameter bertaip tidak dikenali. FUNCTION move(s AS Sprite)
tidak memberikan s satu family, lintasan itu hanya membaca pengisytiharan
dan tugasan pada peringkat penyataan. Ini dinyatakan di sini kerana ia adalah
satu had sebenar, bukan satu pepijat untuk anda cari.
⚠️ Katalog membuang kata kerja pada sifat, dan mengekalkannya pada
lifecycle. SpritePosition menulis, SpriteX membaca, dan tiada satu pun
daripadanya membawa Set atau Get: 4 arahan dalam keseluruhan katalog
bermula dengan Set, dan tiada satu pun bermula dengan Get. Kata kerja
itu bertahan di mana sesuatu wujud atau berakhir: CreateSprite,
LoadImage, DeleteSprite.
Ini berbaloi diketahui kerana satu kesilapan ejaan adalah satu ralat
kompilasi, dan Set… ialah kesilapan ejaan yang biasa orang buat. Katalog
itu adalah pihak berkuasa, dan rujukan itu
dijana daripadanya.
Interpolasi string, opt in#
Print($"score: {points}") ` "score: " + Str(points)
{{ dan }} menulis kurungan dakap literal.
⚠️ Prefix $ adalah wajib, dan ia bukan hiasan. Menginterpolasi setiap
literal memecahkan JSON tulisan tangan, yang diambil secara rutin oleh API
dunia:
CreateTerrain("island", "{\"preset\":\"island\",\"size\":256}")
Di situ kurungan dakap itu adalah data, bukan lubang. Satu string tanpa prefix dibiarkan tidak disentuh tidak kira apa kandungannya.
Penamaan adalah penunjuk#
Satu program klasik mencipta beratus-ratus objek. Hanya yang DINAMAKAN
memasuki Scene Graph, SpriteName(id, "player") dan yang seangkatan
dengannya adalah yang meletakkan satu objek dalam pepohon di mana selebihnya
Engine dapat melihatnya. LightName dan ParticlesName melakukan perkara
yang sama untuk satu lampu dan satu pemancar.
Tutorial Namakan apa yang program anda cipta membawa anda melalui ini: adegan yang sama, sekali dengan pepohon kosong dan sekali dengan tiga entri di dalamnya.
Katalog arahan#
2 237 arahan, 2 550 overload awam, 43 kategori. Yang terbesar:
| 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 |
ditambah 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 dan Compute adalah tambahan Aukimi sendiri kepada dialek klasik itu, arahan konsol, penamaan objek, dan pipeline WebGPU.
Rujukan arahan yang lengkap menyenaraikan kesemuanya, dengan setiap parameter dan setiap overload, dan carianya sendiri, dijana daripada katalog yang sama yang dikira oleh halaman ini, jadi ia tidak boleh ketinggalan daripadanya. Panel API editor itu sendiri turut membaca katalog itu.
Halaman ini mendokumenkan bahasa itu; halaman itu mendokumenkan arahan-arahan.
Had dan masalah biasa#
- Tanda kurung bukan pilihan pada satu arahan. Bentuk PureBasic
telanjang (
Debug "x") ditolak, kerana ia membuka semula kekaburan pembolehubah/arahan yang menjadi asas pengawal waktu-kompilasi itu. - Satu fungsi pengguna mengatasi satu arahan katalog dengan nama yang sama, dan satu pembolehubah boleh berkongsi nama satu arahan dalam satu pengisytiharan bertaip, di sebelah kiri satu tugasan, atau sebagai akar satu path.
- Pembolehubah dan fungsi pengguna tidak sensitif huruf besar/kecil, dan ruang simbol mereka benar-benar berasingan daripada katalog itu.
Printbukan satu log. Lihat di atas; itulah kesilapan yang memenuhi satu konsol.- Compute tidak dieksport. Tulis laluan fallback sebelum anda bergantung kepadanya.