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.

4. Liste ve sözlük

İki temel koleksiyon: sıralı liste ve anahtar→değer eşleyen sözlük.

Liste

KabaLang
notlar = [72, 95, 48, 88, 61]

notlar.ekle(100)                       # sona ekler
dogrula(notlar.uzunluk() == 6, "uzunluk")
dogrula(notlar[0] == 72, "indeksleme 0'dan başlar")
dogrula(notlar.icerir(48), "icerir")
dogrula(notlar.bul(48) == 2, "bul — konumu verir, yoksa -1")

notlar.sirala()
dogrula(notlar[0] == 48, "sıralı ilk eleman")

notlar.sil(0)                          # KONUMA göre siler
dogrula(notlar.uzunluk() == 5, "sil")

dogrula(notlar.dilim(0, 2).uzunluk() == 2, "dilim(baslangic, adet)")
yazdir(f"liste: {notlar}")
İşlem Yazımı
eleman ekleme l.ekle(deger)
eleman okuma l[i] (0 tabanlı)
uzunluk l.uzunluk()
arama l.icerir(deger) · l.bul(deger)
sıralama l.sirala() (Türkçe) · l.sirala_kod_noktasi()
silme l.sil(konum)
parça l.dilim(baslangic, adet)

Boş liste ile başlayıp doldurabilirsiniz:

KabaLang
sepet = []
sepet.ekle("elma")
sepet.ekle("armut")
dogrula(sepet.uzunluk() == 2, "boş listeye ekleme")
yazdir(f"{sepet}")

Toplam, en büyük, en küçük — döngüyle

⚠️ Listede toplam(), en_buyuk(), en_kucuk(), ters_cevir() diye metot yoktur (ölçüldü: 'class QList<Sayı>' nesnesinde böyle bir metot bulunamadı). Bunlar döngüyle yazılır — dilin bugünkü yüzeyi budur:

KabaLang
sayilar = [5, 3, 8, 1]

toplam = 0
enb = sayilar[0]
enk = sayilar[0]
dongu x icinde sayilar:
    toplam = toplam + x
    eger x > enb:
        enb = x
    eger x < enk:
        enk = x

dogrula(toplam == 17, "toplam")
dogrula(enb == 8, "en büyük")
dogrula(enk == 1, "en küçük")
yazdir(f"toplam={toplam} en_buyuk={enb} en_kucuk={enk}")

İki argümanlı bir en_buyuk(a, b) fonksiyonu da yoktur; karşılaştırmayı eger ile yazın.

dogru/yanlis listesi de kurulabilir:

KabaLang
secimler = [dogru, yanlis, dogru]
secimler.ekle(yanlis)
say = 0
dongu s icinde secimler:
    eger s:
        say = say + 1
dogrula(say == 2, "mantık listesi")

İç içe liste (tablo, matris)

Listenin öğeleri liste olabilir. İç listeler aynı tipte olmalı (hepsi tam sayı, hepsi ondalık ya da hepsi metin listesi):

KabaLang
m = [[1, 2], [3, 4]]
dogrula(m[1][0] == 3, "satır 1, sütun 0")

tablo = []
tablo.ekle([1, 2, 3])
tablo.ekle([4, 5, 6])

toplam = 0
dongu satir icinde tablo:
    dongu h icinde satir:
        toplam = toplam + h
dogrula(toplam == 21, "tüm hücreler")
yazdir(tablo)

⚠️ Bir listenin bütün öğeleri aynı tipte olur: [1, "a"] derleme hatasıdır (KARISIK_LISTE). Tek istisna sayılardır: [1, 2.5] ondalık listedir ([1.0, 2.5]).

⚠️ [[1, 2], [3.5]] gibi karışık bir liste derleme hatası verir (KARISIK_LISTE): tam sayı ve ondalık iç listeler ayrı tiplerdir. Tam sayıları ondalık yazın: [[1.0, 2.0], [3.5]].

Liste üzerinde dönmek

KabaLang
urunler = ["klavye", "fare", "ekran"]

dongu u icinde urunler:
    yazdir("• " + u)

# sıra numarası gerekiyorsa sayaç tutulur:
i = 0
iken i < urunler.uzunluk():
    yazdir(f"{i + 1}. {urunler[i]}")
    i = i + 1

Sözlük

KabaLang
bilgi = {"isim": "Semih", "yas": 28, "aktif": dogru}

bilgi["sehir"] = "İstanbul"            # ekleme
bilgi["yas"] = 29                      # güncelleme

dogrula(bilgi["isim"] == "Semih", "okuma")
dogrula(bilgi.var_mi("sehir"), "var_mi")
dogrula(bilgi.icerir("yas"), "icerir — var_mi ile aynı iş")
dogrula(bilgi.uzunluk() == 4, "uzunluk")

bilgi.sil("aktif")                     # ANAHTARA göre siler
dogrula(bilgi.uzunluk() == 3, "sil")

yazdir(f"sözlük: {bilgi}")

⚠️ liste.sil(i) konuma, sozluk.sil(anahtar) anahtara göre siler. Listede olmayan bir konumu silmek (l.sil(10)) çalışma hatası verir — sessizce hiçbir şey yapmadan geçmez. Aynı adın iki koleksiyonda farklı anlamı vardır.

Sözlük bir yapının alanı olabilir; alan üzerinden yazılır ve okunur:

KabaLang
yapi Depo:
    stok: sozluk<metin, sayi> = {}

d = Depo()
d.stok["elma"] = 3
d.stok["armut"] = 5
dogrula(d.stok["elma"] + d.stok["armut"] == 8, "sözlük alanı")

İç içe sözlük ve listeye (örneğin çözülmüş JSON'a) zincirle erişilir; eksik anahtar ya da sınır dışı konum .kbl satırıyla hata verir:

KabaLang
kullan json

v = json.coz("{\"kisi\": {\"ad\": \"Ada\", \"notlar\": [70, 90]}}")
dogrula(v["kisi"]["ad"] == "Ada", "iç içe anahtar")
dogrula(v["kisi"]["notlar"][1] == 90, "iç içe liste")

Sözlükte gezmek

KabaLang
h = {"ad": "Deniz", "sehir": "İzmir"}

dongu k icinde h.anahtarlar():
    yazdir(f"{k} = {h[k]}")

dogrula(h.anahtarlar().uzunluk() == 2, "anahtarlar()")
dogrula(h.degerler().uzunluk() == 2, "degerler()")

Listede yapı tutmak

Listeler yapı (yapi) nesnelerini de tutar — ayrıntısı 5. sayfada:

KabaLang
yapi Urun:
    ad = ""
    fiyat = 0

sepet = []

k = Urun()
k.ad = "Klavye"
k.fiyat = 750
sepet.ekle(k)

f = Urun()
f.ad = "Fare"
f.fiyat = 300
sepet.ekle(f)

toplam = 0
dongu u icinde sepet:
    yazdir(f"  {u.ad} — {u.fiyat} TL")
    toplam = toplam + u.fiyat

dogrula(toplam == 1050, "sepet toplamı")
yazdir(f"sepet toplamı: {toplam} TL")

koleksiyon — toplama ve dönüştürme

Listenin kendi metotları (ekle · sil · sirala · icerir · uzunluk) yerinde çalışır. Toplama ve dönüştürme işlemleri ayrı bir modüldedir ve hepsi kopya döner — kaynak liste değişmez.

KabaLang
kullan kaba.koleksiyon

l = [3, 1, 2, 3]

dogrula(koleksiyon.topla(l) == 9, "topla")
dogrula(koleksiyon.en_kucuk(l) == 1, "en_kucuk")
dogrula(koleksiyon.en_buyuk(l) == 3, "en_buyuk")
dogrula(koleksiyon.say(l, 3) == 2, "say")

# Bulunamayan öğe: istisna DEĞİL, -1
dogrula(koleksiyon.indeks(l, 2) == 2, "indeks")
dogrula(koleksiyon.indeks(l, 9) == 0 - 1, "yoksa -1")

# Sıra
dogrula(koleksiyon.sirali(l).uzunluk() == 4, "sirali kopya döner")
dogrula(l.uzunluk() == 4, "kaynak değişmedi")

# Koşullu
buyukler = koleksiyon.filtrele(l, (x) => x > 1)
dogrula(buyukler.uzunluk() == 3, "filtrele")
dogrula(koleksiyon.esle(l, (x) => x * 10).uzunluk() == 4, "esle")
dogrula(koleksiyon.hepsi(l, (x) => x > 0), "hepsi")
dogrula(koleksiyon.herhangi(l, (x) => x > 2), "herhangi")

yazdir("koleksiyon tamam")

⚠️ benzersiz SIRAYI KORUR. [3, 1, 2, 3] → [3, 1, 2]. Önce sıralayıp komşuları atan bir uygulama [1, 2, 3] verirdi; paket adı ya da yol listesi gibi sıraya bağlı verilerde bu sessiz bir bozulmadır.

⚠️ Boş listede hepsi DOĞRU, herhangi YANLIŞ döner (Python ile aynı). "Hepsi sağlıyor mu?" sorusunun boş kümede cevabı evettir.

⚠️ esle girdiyle AYNI TÜR liste döner. Sayı listesinden metin listesi üretmek bu imzayla ifade edilemez; onun için dongu yazılır. Sessizce yanlış tür üretmektense açıkça desteklememek yeğdir.

⚠️ Boş liste sabiti [] METİN listesidir. Öğe tipi olmadığı için koleksiyon.topla([]) sayı beklendiğinde derlenmez. Sayı listesi isteyen [0] ile başlayıp sil(0) yapar ya da listeyi filtrele ile türetir.

Sonraki adım

5. Yapı ve sınıf