Files
semih 494781e84f Dersler ve Temeller; web örnekleri PORT ortam değişkenini okur
- dersler/: 29 kısa ders (açıklama, çalıştırılabilir örnek, alıştırma). Her örneğin
  ve alıştırma çözümünün çıktısı Online IDE'nin hazırlık adımında gerçekten koşulup
  dosyadakiyle karşılaştırılır; biçim dersler/BICIM.md.
- temeller/: tek konulu 12 başlangıç programı.
- web/anket, web/kisalt, web/pano: port PORT ortam değişkeninden okunur (Online IDE
  önizlemesi 8080 verir), yoksa eski sabit port.
- README: öğrenme bölümü, Online IDE bağlantısı.
2026-10-17 22:07:47 +03:00

117 lines
5.0 KiB
Plaintext

# Hatalar: sonuc türüyle beklenen hatalar, ? ile yayma, dene/yakala/firlat
#
# Programlar her zaman yolunda gitmez: kullanıcı yanlış değer girer, bir sayı
# sıfıra bölünür, listede olmayan bir sıra istenir. KabaLang'de iki yol vardır:
# sonuc<T, Hata> : beklenebilir hatalar için. Fonksiyon ya başarıyı (tamam)
# ya da hatayı (hata) döndürür; çağıran ikisini de ele almak zorundadır.
# dene / yakala / firlat : programın o noktada devam edemeyeceği durumlar için.
# ── sonuc: başarı ya da hata döndüren fonksiyon ───────────────
# Dönüş türü sonuc<sayi, Hata>: başarıda bir sayı, başarısızlıkta bir hata taşır.
fonksiyon yas_coz(girdi: metin) -> sonuc<sayi, Hata>:
temiz = girdi.kirp()
eger temiz.bos_mu():
don hata("yaş boş bırakılamaz")
# Her karakter bir rakam mı?
dongu harf icinde temiz:
eger degil "0123456789".icerir(harf):
don hata(f"'{temiz}' bir sayı değil")
yas = sayi(temiz)
eger yas > 130:
don hata(f"{yas} yaş gerçekçi değil")
don tamam(yas)
# ── ?: hatayı yukarı iletmek ──────────────────────────────────
# yas_coz(...)? şunu der: sonuç hataysa bu fonksiyondan da AYNI hatayla hemen çık;
# başarılıysa içindeki sayıyı ver. Her adımda eger yazmaktan kurtarır.
# ? yalnız kendisi de sonuc döndüren bir fonksiyonun içinde kullanılabilir.
fonksiyon yas_farki(birinci: metin, ikinci: metin) -> sonuc<sayi, Hata>:
a = yas_coz(birinci)?
b = yas_coz(ikinci)?
eger a > b:
don tamam(a - b)
don tamam(b - a)
# ── firlat: devam edilemeyen durum ────────────────────────────
# firlat çalışınca fonksiyon orada biter; hata, onu yakalayan ilk dene bloğuna kadar çıkar.
fonksiyon stoktan_dus(stok: sayi, adet: sayi) -> sayi:
eger adet <= 0:
firlat hata(f"geçersiz adet: {adet}")
eger adet > stok:
firlat hata(f"stokta {stok} ürün var, {adet} istendi")
don stok - adet
fonksiyon yesil(m: metin) -> metin:
don "\033[32m" + m + "\033[0m"
fonksiyon kirmizi(m: metin) -> metin:
don "\033[31m" + m + "\033[0m"
# ════════════════ Program buradan başlıyor ════════════════
# ── sonuc'u kullanmak ─────────────────────────────────────────
yazdir("Yaş girdilerini denetleyelim:")
dongu girdi icinde ["34", " 7 ", "", "otuz", "250"]:
r = yas_coz(girdi)
# tamam_mi() / hatali_mi() hangisi olduğunu söyler.
# deger() başarıdaki sayıyı, hata().mesaj() hatanın açıklamasını verir.
eger r.tamam_mi():
yazdir(yesil(" ✓ ") + f"\"{girdi}\" → {r.deger()} yaş")
degilse:
yazdir(kirmizi(" ✗ ") + f"\"{girdi}\" → {r.hata().mesaj()}")
# sonuc döndüren bir fonksiyonu çağırıp sonucu hiç kullanmamak derleme hatasıdır:
# yas_coz("12") tek başına bir satırda yazılırsa program derlenmez.
# Sonucu bilerek atmak istiyorsan bunu açıkça yazarsın: _ = yas_coz("12")
yazdir()
yazdir("Yaş farkları:")
dongu ikili icinde [["40", "12"], ["40", "kırk"], ["", "12"]]:
f = yas_farki(ikili[0], ikili[1])
eger f.tamam_mi():
yazdir(f" {ikili[0]} ile {ikili[1]} arası {f.deger()} yıl")
degilse:
yazdir(f" hesaplanamadı: {f.hata().mesaj()}")
yazdir()
# ── dene / yakala ─────────────────────────────────────────────
# dene bloğunda bir hata fırlatılırsa blok orada kesilir ve yakala bloğu çalışır.
# yakala h: hata metnini h adıyla verir. Hata olmazsa yakala hiç çalışmaz.
stok = 10
dongu istek icinde [3, 4, 0, 5]:
dene:
stok = stoktan_dus(stok, istek)
yazdir(f" {istek} adet satıldı, stokta {stok} kaldı")
yakala h:
yazdir(kirmizi(" satış yapılamadı: ") + h)
yazdir()
# ── Dilin kendi fırlattığı hatalar ────────────────────────────
# Sıfıra bölme, listede olmayan bir sıra, sözlükte olmayan bir anahtar...
# Yakalanmazlarsa program bu satırda durur. Yakalanırlarsa program devam eder.
# Hata metni dosya adını ve satır numarasını da içerir; hatayı bulmanın ilk ipucu budur.
bolen = 0
dene:
yazdir(100 // bolen)
yakala h:
yazdir("Bölme hatası yakalandı:")
yazdir(f" {h}")
sehirler = ["Rize", "Artvin"]
dene:
yazdir(sehirler[5])
yakala h:
yazdir("Liste hatası yakalandı:")
yazdir(f" {h}")
# yakala'dan sonra ad yazmazsak hata metni kullanılmaz, yalnız yakalanır.
basarili = dogru
dene:
firlat "bağlantı kurulamadı"
yakala:
basarili = yanlis
yazdir(f"İşlem başarılı mı? {basarili}")
yazdir()
yazdir("Bütün hatalar ele alındı; program sonuna kadar çalıştı.")