KABAFORCEGeliştirici KabaOS'u edinin
Önizleme · 0.6.0 — dil 1.0 öncesidir; sözdizimi ve kütüphane değişebilir. Buradaki her örnek derlenerek sınanır.

2. Temel sözdizimi

Değişken · tür · işleç · koşul · döngü · fonksiyon. Bu sayfayı bitirdiğinizde dilin iskeletini biliyor olacaksınız.

Girinti blokları tanımlar

KabaLang'de blok açan her satır : ile biter, gövdesi girintilidir (4 boşluk önerilir). Süslü parantez yoktur.

KabaLang
eger 2 > 1:
    yazdir("içerideyim")
yazdir("dışarıdayım")

Değişkenler ve temel türler

Tür yazmanız gerekmez; değerden anlaşılır.

KabaLang
ad    = "Deniz"        # metin
yas   = 30             # sayi   (tam sayı)
boy   = 1.78           # ondalik
aktif = dogru          # mantik (dogru / yanlis)

yazdir(f"{ad} {yas} {boy} {aktif}")

# Türler arası dönüşüm açıkça yapılır:
dogrula(sayi("42") == 42, "metinden sayıya")
dogrula(metin(42) == "42", "sayıdan metne")
dogrula(ondalik("2.5") + 0.5 == 3.0, "metinden ondalığa")
dogrula(sayi("3.9") == 3, "ondalık metin sayi(3.9) gibi kırpılır")

Sayı olmayan bir metni (sayi("abc"), sayi("")) çevirmek çalışma hatasıdır — eskiden sessizce 0 dönüyordu. Kullanıcı girdisi gibi çevrilemeyebilecek metinler için konsol.sayi_coz(m) / konsol.ondalik_coz(m) kullanın: belki döner, bos_mu() ile denetlenir.

Tür Örnek değer Nedir
sayi 42, -7 tam sayı
ondalik 1.78 kayan noktalı sayı
metin "merhaba" Unicode metin (UTF-8)
mantik dogru, yanlis doğruluk değeri
liste [1, 2, 3] sıralı dizi (4. sayfa)
sozluk {"a": 1} anahtar→değer (4. sayfa)

Uzun sayılarda basamakları _ ile gruplayabilirsiniz; değer değişmez:

KabaLang
nufus = 85_000_000
oran = 1_000.5
dogrula(nufus == 85000000, "rakam ayırıcı")
dogrula(oran * 2 == 2001.0, "ondalıkta da")

İsterseniz türü açıkça de yazabilirsiniz; derleyici o zaman denetler:

KabaLang
fonksiyon topla(a: sayi, b: sayi) -> sayi:
    don a + b

dogrula(topla(2, 3) == 5, "topla")
yazdir("tip bildirimi çalışıyor")

İşleçler

KabaLang
dogrula(7 + 2 == 9,   "toplama")
dogrula(7 - 2 == 5,   "çıkarma")
dogrula(7 * 2 == 14,  "çarpma")
dogrula(7 // 2 == 3,  "tam bölme")
dogrula(7 % 2 == 1,   "kalan")
dogrula(2 ** 10 == 1024, "üs")

dogrula((3 > 2) ve (2 > 1), "ve")
dogrula((3 < 2) veya dogru, "veya")
dogrula(degil yanlis, "degil")

yazdir("işleçler tamam")

Mantık işleçleri sözcüktür: ve · veya · degil. &&, ||, ! yoktur.

Bileşik atama x op= y, x = x op y ile aynıdır: += -= *= /= %= //= **=.

KabaLang
x = 10
x %= 4
x **= 3
dogrula(x == 8, "bileşik atama")
o = 10.0
o /= 4
dogrula(o == 2.5, "ondalık bölme")

Bit işleçleri

Tam sayı (sayi, 64 bit, iki tümleyen) üzerinde simgeyle yazılır: & (ve), | (veya), ^ (özel veya), ~ (tümleyen), << ve >> (kaydırma; >> işareti korur). Öncelik Python'daki gibidir: + - kaydırmadan, kaydırma &'den, & ^'den, ^ |'dan, hepsi karşılaştırmadan önce bağlanır.

KabaLang
dogrula(12 & 10 == 8, "ve")
dogrula(12 | 10 == 14, "veya")
dogrula(12 ^ 10 == 6, "özel veya")
dogrula(~0 == -1, "tümleyen")
dogrula(1 << 10 == 1024, "sola kaydır")
dogrula(-16 >> 2 == -4, "sağa kaydır (işaret korunur)")

Bit işleçleri yalnız sayi alır; mantik için ve/veya/degil yazılır (dogru & yanlis derleme hatasıdır). Kaydırma miktarı 0..63 dışındaysa sabitte derleme hatası (KAYDIRMA_MIKTARI), değişkende çalışma zamanı hatasıdır.

Taşma: varsayılan durdurur, açıkça sarmak ya da denetlemek

+ - * taşarsa program durur (D5). Özet/sağlama toplamı gibi sarması istenen hesap ve taşmayı değer olarak ele almak için yerleşik işlevler:

KabaLang
dogrula(sarmali_topla(9223372036854775807, 1) == -9223372036854775807 - 1, "sarar")
t = denetimli_carp(3037000500, 3037000500)     # -> belki<sayi>
dogrula(degil t.var_mi(), "taştı → bos")
dogrula(denetimli_topla(2, 3).deger_veya(0) == 5, "taşmadı → dolu(5)")

sarmali_topla/cikar/carp ve denetimli_topla/cikar/carp vardır.

Değişkenin türü ilk atamada belirlenir. sayi başlamış bir değişkene ondalık değer yazmak (x = 10 · x /= 4) kesir kısmını sessizce kaybettireceği için derleme hatasıdır (ONDALIK_KIRPMA); ondalık tutacaksa x = 10.0 ile başlatın.

Koşul — eger / degilse

KabaLang
sicaklik = 31

eger sicaklik > 30:
    yazdir("Hava sıcak.")
degilse:
    yazdir("Hava serin.")

Çok basamaklı karar için degilse eger yazılır:

KabaLang
fonksiyon derece(n):
    eger n > 100:
        don "çok büyük"
    degilse eger n > 10:
        don "büyük"
    degilse eger n > 5:
        don "orta"
    degilse:
        don "küçük"

fonksiyon ana():
    yazdir(derece(7))
ana()

⚠️ Bu kılavuzun 2026-09-23'ten önceki sürümleri "degilse eger YOKTUR" diyordu; o eksik giderildi, yukarıdaki biçim bugün çalışır.

degilse: içine yeni bir eger yazmak da geçerlidir; ikisi aynı işi yapar:

KabaLang
n = 7

eger n > 10:
    yazdir("büyük")
degilse:
    eger n > 5:
        yazdir("orta")
    degilse:
        yazdir("küçük")

Döngü — iken

Koşul doğru olduğu sürece tekrar eder.

KabaLang
sayac = 1
iken sayac <= 5:
    yazdir(f"{sayac}. satır: " + "★".tekrarla(sayac))
    sayac = sayac + 1

Döngü — dongu ... icinde

Bir listenin ya da sayı aralığının üzerinde gezer.

KabaLang
sehirler = ["İstanbul", "Ankara", "İzmir"]
dongu sehir icinde sehirler:
    yazdir(f"şehir: {sehir}")

toplam = 0
dongu i icinde 1..5:          # 1, 2, 3, 4, 5 — üst sınır DAHİLDİR
    toplam = toplam + i
dogrula(toplam == 15, "1..5 toplamı 15 olmalı")

İndeks döngüsünde ..< üst sınırı hariç tutar — 0..<l.uzunluk() boş listede hiç dönmez, 0..n - 1 gibi tek-fazla hatasına yer bırakmaz. adim artışı belirler (azalan için eksi):

KabaLang
l = [10, 20, 30]
s = 0
dongu i icinde 0..<l.uzunluk():   # 0, 1, 2
    s = s + l[i]
dogrula(s == 60, "0..<n")

besler: liste<sayi> = []
dongu i icinde 0..20 adim 5:      # 0, 5, 10, 15, 20
    besler.ekle(i)
geri: liste<sayi> = []
dongu i icinde 10..0 adim -3:     # 10, 7, 4, 1
    geri.ekle(i)
dogrula(l[0..<2] == [10, 20], "dilimde de aynı anlam")

adim 0 derleme (değişkense çalışma zamanı) hatasıdır. adim yalnız döngü başlığında, aralıktan sonra sözcüktür; başka yerde sıradan bir addır.

Sıra numarası ile öğeyi, sözlükte anahtar ile değeri birlikte açmak için (ara liste kurulmaz):

KabaLang
urunler = ["klavye", "fare"]
dongu i, ad icinde urunler.numarali():     # (0, klavye), (1, fare)
    yazdir(f"{i + 1}. {ad}")

ayarlar = {"dil": "tr", "tema": "koyu"}
dongu k, v icinde ayarlar.ciftler():
    yazdir(f"{k} = {v}")

kir ve devam

KabaLang
toplam = 0
i = 0
iken i < 10:
    i = i + 1
    eger i % 2 == 0:
        devam          # bu turu atla
    eger i > 7:
        kir            # döngüden tümden çık
    toplam = toplam + i

dogrula(toplam == 16, f"1+3+5+7 = 16 bekleniyordu, {toplam} çıktı")
yazdir("döngü denetimi tamam")

İç içe döngüden tek adımda çıkmak için döngüye etiket verilir; kir ad / devam ad o döngüyü hedefler (bayrak değişkenine gerek kalmaz):

KabaLang
tablo = [[1, 2], [3, 99]]
konum = ""
dis: dongu satir icinde 0..<2:
    dongu sutun icinde 0..<2:
        eger tablo[satir][sutun] == 99:
            konum = f"{satir},{sutun}"
            kir dis
dogrula(konum == "1,1", "etiketli kir")

Etiket iken için de yazılır (ana: iken kosul:). Çevrede olmayan bir etiket derleme hatasıdır (DONGU_ETIKETI).

Fonksiyonlar

KabaLang
fonksiyon selam(ad: metin = "dünya") -> metin:
    don "merhaba " + ad

fonksiyon faktoriyel(n: sayi) -> sayi:
    eger n <= 1:
        don 1
    don n * faktoriyel(n - 1)

dogrula(selam() == "merhaba dünya", "varsayılan parametre")
dogrula(selam("KabaOS") == "merhaba KabaOS", "argümanlı çağrı")
dogrula(faktoriyel(5) == 120, "özyineleme")
yazdir("fonksiyonlar tamam")
  • Dönüş: don (dondur DEĞİL).
  • Parametre türü ve dönüş türü isteğe bağlıdır — yazarsanız denetlenir.
  • Varsayılan değerli parametreler sondadır.

Fonksiyon ve dışarıdaki değişkenler — kuresel

Fonksiyon (ya da metot), kendisinden önce modül düzeyinde (fonksiyonların dışında) tanımlanmış bir değişkeni okuyabilir. O değişkene yazmak (=, +=, çoklu atama, döngü değişkeni olarak kullanmak) ise gövdenin başında kuresel ad bildirimi ister; bildirim yoksa derleme hatasıdır (KURESEL_BILDIRIMSIZ). Sebep: fonksiyonun dışarıdaki bir değeri sessizce değiştirmesi, programın başka bir yerinde iz sürülmesi zor bir yan etkidir (KARAR D10).

Derlenmez
sayac = 0

fonksiyon arttir():
    sayac = sayac + 1      # 'sayac' fonksiyonun dışında tanımlı

arttir()
KabaLang
sayac = 0
oran = 3

fonksiyon arttir():
    kuresel sayac          # gövdenin İLK satırı; birden çoksa: kuresel a, b
    sayac = sayac + oran   # `oran` yalnız okunuyor — bildirim gerekmez

arttir()
arttir()
dogrula(sayac == 6, "kuresel ile modül düzeyindeki değer değişti")

# Çoğu zaman daha açık yol: değeri parametre olarak alıp `don` ile döndürmek.
fonksiyon artmis(n: sayi) -> sayi:
    don n + 1

sayac = artmis(sayac)
dogrula(sayac == 7, "parametre + don")
yazdir("kuresel tamam")
  • kuresel yalnız fonksiyon gövdesinin başında yazılır; fonksiyon dışında, bir bloğun içinde ya da başka satırlardan sonra yazılırsa hata (KURESEL_YERI).
  • Ad, fonksiyondan önce modül düzeyinde değer almış olmalı; yoksa KURESEL_TANIMSIZ. Parametreyle aynı ad olamaz (KURESEL_PARAMETRE).
  • Etkilenmeyenler: aynı kapsamda yeniden atama (x = 5, sonra x = 10), self.alan = ..., listeye/sözlüğe yerinde yazma (l.ekle(x), d["k"] = v) ve olay işleyicileri (dugme.tiklandiginda:).
  • Fonksiyondan sonra tanımlanan aynı adlı değişken fonksiyonu etkilemez: oradaki atama fonksiyonun kendi yerelidir.
  • İç içe fonksiyonda bildirim her fonksiyonun kendisinde yazılır; dıştaki fonksiyonun kureseli içtekine geçmez.

Tek satırlık fonksiyon

KabaLang
kare = (x) => x * x
dogrula(kare(6) == 36, "tek satırlık fonksiyon")
yazdir("tek satırlık fonksiyon tamam")

Kapanış — çok satırlı ve kaçan anonim fonksiyon

=>'dan sonra satır biterse gövde girintili bloktur. Anonim fonksiyon dışarıdaki değişkenleri değerle yakalar (oluşturulduğu andaki değer) ve fonksiyondan döndürülebilir:

KabaLang
fonksiyon carpan(k: sayi):
    don (x) => x * k          # k kapanışla birlikte yaşar

ikiyle = carpan(2)
dogrula(ikiyle(5) == 10, "kaçan kapanış")

onek = "Sn. "
selamla = (ad) =>
    tam = onek + ad
    don tam + "!"
onek = "Dr. "                 # yakalama değerledir: kapanış "Sn. " gördü
dogrula(selamla("Ali") == "Sn. Ali!", "değerle yakalama")

Yakalanan bir adı kapanışın içinde değiştirmek derleme hatasıdır (KAPANIS_YAZMA) — yeni değeri döndürün. Çok satırlı gövde bir çağrının parantezi içinde yazılamaz (satırlar parantez içinde birleşir): kapanışı önce bir ada atayın, sonra adı geçirin.

main yok — dosya yukarıdan aşağı çalışır

KabaLang'de zorunlu bir başlangıç fonksiyonu yoktur; dosyadaki satırlar sırayla çalışır. İsterseniz kendiniz bir ana() yazıp çağırırsınız (konsol şablonu bunu yapar).

KabaLang
fonksiyon ana():
    yazdir("program başladı")
    don 0

ana()

Argüman yayılması — f(*liste)

Elinizde bir liste varsa, öğelerini tek tek yazmak yerine * ile yayabilirsiniz:

KabaLang
fonksiyon topla(a, b, c):
    don a + b + c

sayilar = [10, 20, 30]
dogrula(topla(*sayilar) == 60, "liste yayılması")

ikisi = [20, 30]
dogrula(topla(10, *ikisi) == 60, "konumsal + yayılma")

fonksiyon selamla(ad, soyad):
    don "Merhaba " + ad + " " + soyad

isim = ["Ayşe", "Yılmaz"]
dogrula(selamla(*isim) == "Merhaba Ayşe Yılmaz", "metin listesi yayılması")
yazdir("argüman yayılması tamam")

Liste uzunluğu çalışma anında denetlenir: topla(*[1, 2]) derlenir ama koşarken 'topla' 3 argüman bekliyor, yayılan liste 2 öğe taşıyor der. Uzun liste de hatadır — sessizce kırpılmaz.

Sınırlar (hepsi derleme anında, KabaLang iletisiyle reddedilir):

Yazım Neden olmaz
f(**sozluk) Sözlük anahtarları metindir ve çalışma anında belli olur; anahtarı isimli bir parametreye eşlemek derleme anında ad bilgisi ister. f(a=1, b=2) yazın.
f(*uret()) Yayılan liste, çağrılanın parametre sayısı kadar kez değerlendirilir; yan etkili bir ifade birden çok koşardı. Önce bir değişkene alın.
f(*[1, 2]) Liste sabitinde öğeler zaten belli — doğrudan f(1, 2) yazın.
f(*a, *b) Hangi listenin kaç argüman verdiği derleme anında bölünemez. Önce birleştirin: hepsi = a + b.
f(*l, k=1) İsimli argümanlar konumsal sıraya açılırken yayılmanın kaç yeri doldurduğu bilinmek zorunda; o sayı çalışma anında belli olur.
yazdir(*l), nesne.metot(*l) Yayılma yalnız bu kaynakta fonksiyon ile tanımlanmış bir ada uygulanabilir; gömülü işlev, metot ve modül işlevinin parametre sayısı derleme anında okunamıyor.
varsayılanlı f(a, b=2) Arite tek bir sayı değil (1–2); listenin kaç öğe vermesi gerektiği belirsiz kalır.

fonksiyon f(*l): — yani değişken sayıda parametre alan fonksiyon tanımlamak — henüz yoktur; parametreyi liste olarak alıp f([1, 2, 3]) diye çağırın.

Sonraki adım

3. Metin ve Türkçe kuralları