15. Tuzaklar — hepsi ölçüldü
Bu sayfadaki her madde denenmiş ve hata çıktısı görülmüştür. Hiçbiri tahmin değildir. "Şöyle olsa güzel olurdu" diye yazılmış bir dil özelliği aramayın: burada yazan, bugün derleyicinin yaptığıdır.
1. Ad yanlışları — en sık düşülen tuzak
| Yanlış | Doğru | Ne olur |
|---|---|---|
dondur |
don |
"böyle bir fonksiyon tanımlanmamış" |
"x".buyuk() / .kucuk() |
.buyut() / .kucult() |
"class Metin nesnesinde böyle bir metot bulunamadı" |
"x".baslar_mi() |
.ile_baslar() |
aynı hata |
"x".biter_mi() |
.ile_biter() |
aynı hata |
l.boyu |
l.uzunluk() |
alan bulunamadı |
en_buyuk(a, b) |
eger a > b: |
iki argümanlı en_buyuk yoktur |
2. degilse eger vardır
fonksiyon ana():
n = 7
eger n > 10:
yazdir("büyük")
degilse eger n > 5:
yazdir("orta")
degilse:
yazdir("küçük")
ana()⚠️ Bu kılavuzun eski sürümleri degilse egerin olmadığını söylüyordu;
o eksik 2026-09-23'te giderildi. Yukarıdaki biçim bugün derlenir ve
çalışır.
3. Listede toplam() / en_buyuk() / ters_cevir() yok
l = [5, 3, 8]
yazdir(metin(l.toplam()))Ölçülen hata: 'class QList<Sayı>' nesnesinde böyle bir metot veya alan
bulunamadı 'toplam'. Bunlar döngüyle yazılır
(4. sayfa).
4. baslat tutamacı yalnız birlikte: içinde
fonksiyon kare(x):
don x * x
g = baslat kare(6)
yazdir(metin(g.bekle()))Derleyici: hata[KAPSAMSIZ_BASLAT] (kabalang acikla KAPSAMSIZ_BASLAT).
Görev tutamacı kapsama bağlıdır (7. sayfa).
5. arkada_calistir yerel değişken yakalayamaz
fonksiyon f():
v = "yerel"
arkada_calistir:
yazdir(v)
f()KACAK_YAKALAMA ile derleme durur — uyarı değil. Yerel değişken görev
bitmeden yok olabilirdi. Çözüm: birlikte: + baslat.
6. sonuc yok sayılamaz
fonksiyon kaydet() -> sonuc<sayi, Hata>:
don tamam(1)
kaydet()YOK_SAYILAN_SONUC. Üç meşru yol: ? ile yay · eger r.hatali_mi() ile
karar ver · _ = kaydet() ile bilerek yok say.
⚠️ Bu hatanın altında bugün ilgisiz bir "Çözüm: görevi birlikte:
kapsamına alın" satırı basılıyor (ölçüldü). Mesajın kendisi doğru, alt
satırdaki öneri yanlış yere ait — ona bakmayın.
7. İki don dalı aynı türü döndürmeli
fonksiyon ortalama(sayilar):
eger sayilar.uzunluk() == 0:
don 0
toplam = 0
dongu s icinde sayilar:
toplam = toplam + s
don toplam / sayilar.uzunluk()
yazdir(metin(ortalama([2, 4, 6])))Derleme, don toplam / sayilar.uzunluk() satırında iki dalın farklı
türler (Sayı ve Ondalık) döndürdüğünü söyleyen bir hatayla durur (bu
ileti henüz Türkçeleştirilmedi, İngilizce görünür). Bölme ondalık ürettiği
için boş dalda da don 0.0 yazılır.
8. Boş liste [] metin listesidir
Sayı toplayan bir fonksiyona [] geçmek derlemeyi kırar
(ambiguous overload for 'operator+'). Boş durumu sınamak için sayı
listesinden eleman silin:
fonksiyon topla_hepsini(sayilar):
toplam = 0
dongu s icinde sayilar:
toplam = toplam + s
don toplam
bos_sayilar = [0]
bos_sayilar.sil(0)
dogrula(topla_hepsini(bos_sayilar) == 0, "boş sayı listesi")
dogrula(topla_hepsini([1, 2, 3]) == 6, "dolu liste")
yazdir("boş liste tuzağı")9. İşleve geçen liste, sözlük ve yapı kopyadır
Python'dan gelenler için en şaşırtıcı fark: işlev, aldığı listeyi ya da yapıyı değiştirdiğinde çağıranın değeri değişmez. İşlev kendi kopyası üzerinde çalışır.
fonksiyon ekle_bir(l):
l.ekle(99)
don l
yapi Sayac:
n = 0
fonksiyon artir(s):
s.n = 5
a = [1]
b = ekle_bir(a)
dogrula(a.uzunluk() == 1, "a değişmedi — işlev kopyayı değiştirdi")
dogrula(b.uzunluk() == 2, "değişiklik DÖNEN değerde")
s = Sayac()
artir(s)
dogrula(s.n == 0, "yapı da kopya olarak geçti")
yazdir("kopya tuzağı")Değişikliği görmek için üç yol var:
- değiştirilmiş değeri döndürüp yeniden atayın:
a = ekle_bir(a); - değiştirme işini yapının metodu yapın: metot kendi nesnesi üzerinde
çalışır (
s.artir()); - nesneyi gerçekten paylaşmak istiyorsanız
sayilan<T>yapın: bütün başvurular aynı nesneyi görür (s = sayilan(Sayac()); ayrıntı ve döngü kuralı: 14. sayfa, Bellek modeli); - parametreyi
degisiryapın — işlev çağıranın değişkenini yerinde değiştirir; çağrı yerinde&zorunludur (niyet iki tarafta da görünür):
fonksiyon ekle_bir(degisir l: liste<sayi>):
l.ekle(99)
yapi Sayac:
n = 0
fonksiyon artir(degisir s: Sayac):
s.n = s.n + 1
a = [1]
ekle_bir(&a)
dogrula(a == [1, 99], "a yerinde değişti")
s = Sayac()
artir(&s)
dogrula(s.n == 1, "yapı yerinde değişti")& bir yer ister: değişken, alan (&k.sayilar) ya da liste öğesi
(&l[1]). &siz çağrı (DEGISIR_ISARET), aynı değişkeni iki degisir
argümanına vermek (DEGISIR_CIFT), degismez bir ad ya da baslat ile göreve
& derleme hatasıdır. İşlev içinden modül değişkenini & ile vermek de bir
yazmadır: kuresel ister. Paylaşılan başvuru eklenmez (D6) — &siz geçen
değer yine kopyadır.
(Eskiden bu bölümde anlatılan "yapı listesi yerinde yazılamaz" tuzağı
giderildi: ozet([k]) ve hesap.ozet([hesap.Kayit()]) artık derleniyor.)
Benzer bir kural modül düzeyindeki değişkenler için de geçerli: fonksiyon
onları okuyabilir ama değiştirmek için gövdesinin başında
kuresel ad yazmalıdır — yoksa derleme hatası (KURESEL_BILDIRIMSIZ).
Ayrıntı: 2. Temel sözdizimi.
10. EOF ile boş satır ayrı şeydir
konsol.satir_oku() bir belki<metin> döner: bos = girdi bitti,
dolu("") = kullanıcı Enter'a bastı. Karıştırırsanız okuma döngünüz ya
sonsuza kadar döner ya da erken biter (9. sayfa).
11. Servis tuzakları (üçü de ölçüldü)
servis.uyu()dönüşünü denetleyin — yok sayarsanız SIGTERM duyulmaz, systemd SIGKILL atar,dururkenkancası hiç çalışmaz.- Döngü koşulu
servis.calisiyor_mu()olmalı;iken dogru:yazarsanız servis yalnız öldürülerek durur. uyu()değilservis.uyu(): öbürü sinyalle uyanmaz, kapanış bir uyku süresi gecikir.
Ayrıca: servis "ad": bloğu olmayan bir programdan systemd birimi üretilmez
(bilerek reddedilir) — öyle bir program açılır açılmaz biter ve systemd onu
sonsuza kadar yeniden başlatır.
12. Web tuzakları
- Sunucu varsayılan olarak yalnız
127.0.0.1i dinler. Ağa açmak açık karardır:web.sunucu(8080, "0.0.0.0"). - İşleyiciler birden çok iş parçacığında koşar; paylaşılan değişkeni
yazmak yarış koşuludur. Tek iş parçacığı:
web.sunucu(port, adres, 1). - İşleyici yalnız kendisinden önce tanımlanmış değişkenleri görür;
aşağıda tanımlanan
sunucudeğişkenine işleyici içinden erişilemez. - Kullanıcı verisi HTML'e girerken
web.kacir()ile kaçırılır;kaciryalnız metin gövdesi içindir, öznitelik/script bağlamına yetmez.
13. Arayüz tuzakları
gorunur/etkindiye özellik yoktur; yazarsanız sessizce hiçbir şey olmaz (ölçüldü: derleyicide 0 eşleşme).- Mantık değerleri noktasız yazılır:
secili = dogru."doğru"yazmak değeri sessizce yanlışa düşürür. - Sayı bekleyen bir özelliğe metin yazmak (
genislik = "abc") sessizce 0 olur — bileşen görünmez. - Değişkene
etiketadını vermeyin: denetçi onu bileşen bildirimi sanar.
14. .kbl mi .kaba mı
.kbl kaynak koddur, .kaba kurulum paketidir. Derleyiciye .kaba verirseniz
"bu bir kaynak kod dosyası değil" der ve durur.
15. Derleme önbelleği paylaşılır
KabaLang derlemeyi hızlandırmak için bir önbellek tutar. Aynı makinede iki ayrı iş (ör. CI'da paralel iki derleme) aynı önbelleği paylaşır. Hız ölçerken ya da işleri birbirinden yalıtmak istediğinizde her işe ayrı bir önbellek dizini verin:
XDG_CACHE_HOME=/tmp/kendi-onbellegim kabalang derle ana.kbl
kabalang temizle # önbelleği tümden sil