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ı.
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
# 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ı.")
|
||||
Reference in New Issue
Block a user