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 menulisApa yang berlaku dahuluApa yang berlaku sekarang
SpritePositon(1, 10, 20)dikompil dengan bersih, sprite itu tidak bergerak, dan kegagalan itu terserlah kemudian sebagai ... is not definedralat kompilasi, dengan ejaan terdekat dalam katalog dicadangkan
Blorp(1, 2)dihantar terus, kata demi kata, ke dalam JavaScript yang dijanaralat kompilasi
ceci nest pas du basicdikeluarkan sebagai satu penyataanralat 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, SetMusicSystemVolume dan GetLightSensorExists, yang katalog hanya kenali sebagai MusicSystemVolume dan LightSensorExists.

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.

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, ClearConsoleselebihnya 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, DIV integer, 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:

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

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.
  • Print bukan satu log. Lihat di atas; itulah kesilapan yang memenuhi satu konsol.
  • Compute tidak dieksport. Tulis laluan fallback sebelum anda bergantung kepadanya.