BASIC dili

aukimi'nin klasik BASIC lehçesi: tipler, yapılar, iki kısayol ve herkesi yakalayan kurallar. Arkasında 2 237 komut var.

Tek cümleyle#

aukimi, klasik bir BASIC lehçesi sunar: bir oyuncak makro sistemi değil, tam bir dil; tipli sayısal değerler, kayıtlar, metotlar, referanslar, yapılandırılmış hatalar, koroutinler ve WebGPU hesaplaması ile. Engine'in TXT görüntü alanı modunda ve betik editörünün BASIC görünümünde yaşar.

JavaScript, kanonik betik API'si olmaya devam ediyor. BASIC, isteğe bağlı bir ön yüzdür: ikisi de aynı özel dağıtıcıya derlenir, yani bir BASIC programı ile bir JavaScript programı tam olarak aynı motora ulaşır. Hiçbir şey ikinci sınıf değildir ve ayrı bir çalışma zamanı yoktur.

Herkesi yakalayan kural#

Bir komut çağrısı her zaman parantez taşır.

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

Bu bir stil meselesi değildir. Derleyicinin bir komutu bir değişkenden ayırt etmesini sağlayan şey budur, ve bir yazım hatasının artık derleme zamanında yakalanmasının nedeni de budur:

YazdığınızEskiden olanŞimdi olan
SpritePositon(1, 10, 20)temiz bir şekilde derlenirdi, sprite hareket etmezdi ve arıza daha sonra ... is not defined olarak ortaya çıkardıderleme hatası, en yakın katalog yazımı önerisiyle birlikte
Blorp(1, 2)üretilen JavaScript'e olduğu gibi aktarılırdıderleme hatası
ceci nest pas du basicbir ifade olarak yayımlanırdıderleme hatası

Bir yazım hatası, kendini bir motor hatası olarak sunardı. 84 demoluk gövde üzerinde ölçüldüğünde, koruma sıfır yanlış pozitif üretti ve iki gerçek sessiz arızayı buldu, SetMusicSystemVolume ve GetLightSensorExists; katalog bunları yalnızca MusicSystemVolume ve LightSensorExists olarak biliyor.

İki sızıntı bilerek açık bırakıldı: console.log("x") ve window.x = 1 hâlâ geçiyor. Bunlar için bir koruma yazıldı, ölçüldü ve geri alındı: BASIC, derleyicinin numaralandıramayacağı isimler sağlayan bir bağlam içinde çalışır; bu yüzden bilinmeyen bir kökü reddetmek geçerli programları da reddediyordu. Buradaki bir yanlış pozitif, sızıntıdan daha kötüdür.

En sık karşılaşılan sürpriz:

Print(...)ekrana çizer, ve bir program bunu her karede çağırır
Console(...)editörün konsoluna yazar, başka hiçbir şey yapmaz
Debug(...)kas hafızası için, PureBasic'in adı altındaki aynı komut
ConsoleWarning, ConsoleError, ClearConsolegünlüğün geri kalanı

Bir kare döngüsündeki Print, konsoldaki her gerçek hatayı boğar; bunların bir bayrakla tek komut yerine iki ayrı komut olmasının nedeni budur.

Tipler#

Sayısal tipler gerçektir ve her hedefte, editörde, HTML dışa aktarımında ve Bevy/native derlemesinde birebir aynı davranır:

  • 8, 16, 32 ve 64 bit işaretli ve işaretsiz tamsayılar, deterministik dönüştürme, tamsayı DIV ve sarma (wrapping) taşmasıyla.
  • float32 ve float64.
  • Klasik sigiller hâlâ çalışır: name$ bir dizedir, speed# bir kayan noktadır.

OPTION EXPLICIT isteğe bağlıdır, ve klasik örtük değişkenler içe aktarılan programların hâlâ çalışması için varsayılan olarak kalır. Bunu açmak, onsuz güvenli olamayan iki özelliğin ön koşuludur: sayısal tipleme ve referanslar; çünkü yanlış yazılmış bir atamanın sessizce bir değişken oluşturması ikisini de bozar.

Yapılar#

Kayıtlar#

TYPE, bir kayıt bildirir. Bunlar keyfi şekilde iç içe geçebilir ve değer semantiğine sahiptir: bir atama, iç içe geçmiş diziler ve koleksiyonlar dahil, derin bir kopya çıkarır.

Metotlar#

METHOD, bir fonksiyonu bir örneğe bağlar; içinde SELF bulunur, New inşa eder ve Delete yok eder. Derin kopyalar metot açısından güvenli kalır.

Referanslar#

REF ve BYREF, iki yazımla aynı şeydir ve ikisi de bir skaler, bir kayıt, tek bir alan, bir dizi, bir liste imleci ya da bir harita girdisi için canlı okuma/yazma parametresi verir. Referanslar çağrılar boyunca ilerler ve sınırda sabit genişlikli tiplere dönüştürülür.

Tutamaçlar#

@hedef, birinci sınıf bir referans alır. HANDLE ve POINTER, denetimli okuma, yazma, geçerlilik ve serbest bırakmayla bunun tipli biçimleridir; ve silinmiş bir kayda giden bir tutamaç, sarkık bırakılmak yerine geçersiz kılınır.

Kontrol ve güvenlik#

Yapılandırılmış hatalar: TRY / CATCH / FINALLY, iç içe, THROW, korumalı RETHROW ve hem yapılandırılmış hem dizeye dayalı yakalamalarla.

Koşullu derleme: #IF / #ELSEIF / #ELSE / #ENDIF, iç içe, özellik bayrakları ve editör, HTML, Bevy, native/wasm ve debug/release için açık profillerle. Her hedefte, dahil etmelerden önce çözülür.

Zengin fonksiyonlar: varsayılan değerler, OPTIONAL, sonda bir PARAMARRAY (ya da ...), güvenli aritelik aşırı yüklemeler, tipli dönüş dönüştürmesi ve klonlanmış kayıt ve dizi dönüşleri.

Çok dosyalı programlar#

#INCLUDE, #INSERT ve IncludeFile, bir programı birden çok dosya hâline getirir. Editör, proje modülleri oluşturur ve içe aktarır, dahil etme yollarını tamamlar, bağımlılık grafını tutar ve her çalışma zamanı hedefi bunun için hazırlanmıştır.

Koroutinler, ve bilerek dışarıda bırakılan şey#

İşbirlikçi görevler etikete dayalıdır; tipli tutamaçlar, bir sonuç ve hata durumu, verim noktalarında iptal ve tek bir görev ya da bir grup üzerinde bekleme ile. Her hedefte oyun zamanlayıcısını paylaşırlar.

Paylaşımlı bellekli iş parçacıkları bilerek dışlanmıştır. "Henüz değil" değil, dışlanmış. Üzerine akıl yürütebileceğiniz işbirlikçi bir zamanlayıcı, yeniden üretemeyeceğiniz bir veri yarışından iyidir.

WebGPU hesaplaması#

Tipli f32 / i32 / u32 depolama tamponları, ham WGSL işlem hatları, kareye göre sıralanmış gönderim ve memblock geri okuma; BASIC'ten gerçek GPU hesaplaması.

⚠️ Yalnızca Engine. HTML hedefi açık bir yetenek hatası fırlatır, ve Bevy hedefi, ilk gönderimde başarısız olan bir ikili üretmek yerine uyumsuzluğu derlemeden önce bildirir.

Aynı sorun için iki kısayol#

Komutların 597'si Set/Get<Nesne><Özellik> olarak adlandırılır: Sprite 66, Tween 58, Text 32, Edit 29. Nesnenin adı fonksiyon adının içindedir ve kimliği her satırın ilk argümanıdır. Aşağıdaki iki kısayol da bu tekrarı kaldırır ve hiçbiri yeni bir API değildir: derleyici gerçek komut adını yeniden inşa eder ve onu katalogda arar.

Bir blok içinde WITH <aile>#

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

Bir ifadenin başında \özellik yazar; başka her yerde okur. Konum karar verir, bu yüzden öğrenilecek ikinci bir gösterim yoktur. WITH hero, tek bir jeton, hâlâ kayıt bloğudur; WITH SPRITE s katalogdan bir aile seçer.

Her yerde başka s.position(...)#

s = CreateSprite(img)     ` aile, oluşturma komutundan ÇIKARILIR
s.position(100, 200)      ` SpritePosition(s, 100, 200)
s.visible = 1             ` SpriteVisible(s, 1)
x# = s.x                  ` SpriteX(s)

Aile, Create<F> / Load<F> / Clone<F>'den, ya da kimlik başka bir yerden geldiğinde açık bir s AS Sprite'tan gelir. Yalnızca ailesi bilinen değişkenler yeniden yazılır: kayıtlar alanlarını korur, listeler metotlarını korur, SELF.alan dokunulmadan kalır.

⚠️ Tipli bir parametre tanınmaz. FUNCTION move(s AS Sprite), s'ye bir aile vermez; geçiş yalnızca ifade düzeyindeki bildirimleri ve atamaları okur. Bu burada söyleniyor çünkü bu gerçek bir sınırdır, avlanacak bir hata değil.

⚠️ Katalog, özelliklerde fiili düşürür ve yaşam döngüsünde tutar. SpritePosition yazar, SpriteX okur, ve ikisinden hiçbiri Set ya da Get taşımaz: tüm katalogda 4 komut Set ile başlar, ve hiçbiri Get ile başlamaz. Fiil, bir şeyin var olduğu ya da sona erdiği yerde hayatta kalır: CreateSprite, LoadImage, DeleteSprite.

Bunu bilmek işe yarar çünkü bir yazım hatası bir derleme hatasıdır ve Set…, insanların yanlarında getirdiği tam olarak o hatadır. Katalog otoritedir, ve referans ondan üretilir.

Dize ilintileme, isteğe bağlı#

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

{{ ve }}, gerçek süslü parantezler yazar.

⚠️ $ öneki zorunludur ve süs değildir. Her sabit değeri ilintilemek, dünya API'sinin rutin olarak aldığı, elle yazılmış JSON'u bozardı:

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

Orada süslü parantezler veridir, delik değil. Önekli olmayan bir dize, içinde ne olursa olsun dokunulmadan bırakılır.

Adlandırmak, göstermektir#

Klasik bir program yüzlerce nesne üretir. Yalnızca ADLANDIRDIKLARI Scene Graph'a girer; SpriteName(id, "player") ve benzerleri, bir nesneyi Engine'in geri kalanının görebileceği ağaca yerleştiren şeydir. LightName ve ParticlesName de aynı şeyi bir ışık ve bir yayıcı için yapar.

Programınızın oluşturduğu şeyi adlandırın eğitimi bunu adım adım anlatır: aynı sahne, bir kez ağaç boş, bir kez üç girdiyle.

Komut kataloğu#

2 237 komut, 2 550 genel aşırı yükleme, 43 kategori. En büyükleri:

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

artı 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 ve Compute, aukimi'nin klasik lehçeye kendi eklemeleridir: konsol komutları, nesne adlandırma ve WebGPU işlem hattı.

Eksiksiz komut referansı, hepsini her parametresi ve her aşırı yüklemesiyle listeler; kendi aramasıyla birlikte, bu sayfanın saydığı aynı katalogdan üretilir, bu yüzden ondan geride kalamaz. Editörün kendi API paneli de aynı kataloğu okur.

Bu sayfa dili belgeliyor; o sayfa komutları belgeliyor.

Sınırlar ve sık karşılaşılan arızalar#

  • Bir komutta parantezler isteğe bağlı değildir. PureBasic'in çıplak biçimi (Debug "x") reddedilir, çünkü bu, derleme zamanı korumasının dayandığı değişken/komut belirsizliğini yeniden açar.
  • Kullanıcı fonksiyonu, aynı adlı bir katalog komutunu geçersiz kılar, ve bir değişken, tipli bir bildirimde, bir atamanın solunda ya da bir yolun kökünde bir komutla aynı adı taşıyabilir.
  • Değişkenler ve kullanıcı fonksiyonları büyük/küçük harfe duyarsızdır, ve sembol alanları katalogunkinden gerçekten ayrıdır.
  • Print bir günlük değildir. Yukarıya bakın; bir konsolu dolduran hata budur.
  • Compute dışa aktarılmaz. Ona güvenmeden önce geri dönüş yolunu yazın.