--- baslik: Sayılabilir türler bolum: Kendi türlerin ozet: sayilabilir ile sınırlı seçenekleri güvenle tutmak --- Bir siparişin durumu "hazırlanıyor", "kargoda" ya da "teslim edildi" olabilir; başka bir şey olamaz. Bunu metinle tutarsan bir gün biri `"kargda"` yazar ve hata gözden kaçar. `sayilabilir`, bir değişkenin alabileceği değerleri baştan sayar; yanlış yazılan bir değer program çalışmadan yakalanır. ## Tanımlamak ve kullanmak Her üye kendi satırına yazılır. Üyeye `Tur.UYE` diye ulaşırsın. ```kbl sayilabilir Durum: HAZIRLANIYOR KARGODA TESLIM_EDILDI siparis = Durum.KARGODA yazdir(siparis) eger siparis == Durum.KARGODA: yazdir("Siparişin yolda.") ``` ```cikti KARGODA Siparişin yolda. ``` Yazdırınca üyenin adı görünür. ## Yanlış üye derlenmez ```kbl goster sayilabilir Renk: KIRMIZI MAVI r = Renk.MOR # derleme hatası: Renk'in MOR diye bir üyesi yok ``` Bu, sayılabilir türlerin asıl yararıdır: yazım hatası programın çalıştığı ana değil, derlendiği ana yakalanır. ## Seçeneğe göre karar vermek Sayılabilir değerler `eger / degilse eger` ile çok iyi anlaşır. Bir trafik ışığının sıradaki rengini bulalım. ```kbl sayilabilir Isik: KIRMIZI SARI YESIL fonksiyon sonraki(i: Isik) -> Isik: eger i == Isik.KIRMIZI: don Isik.YESIL degilse eger i == Isik.YESIL: don Isik.SARI don Isik.KIRMIZI isik = Isik.KIRMIZI dongu adim icinde 1..4: yazdir(isik) isik = sonraki(isik) ``` ```cikti KIRMIZI YESIL SARI KIRMIZI ``` ## Üyelerin sayı değerleri Her üyenin arkasında bir sayı vardır. İlk üye 0'dan başlar; istersen değeri kendin verirsin. Değer yazılmayan üye bir öncekinden devam eder. `sayi()` ile bu değeri alırsın. ```kbl sayilabilir Oncelik: DUSUK = 1 ORTA YUKSEK = 10 yazdir(sayi(Oncelik.DUSUK)) yazdir(sayi(Oncelik.ORTA)) yazdir(sayi(Oncelik.YUKSEK)) yazdir(Oncelik.YUKSEK > Oncelik.ORTA) ``` ```cikti 1 2 10 doğru ``` ## Yapı alanı ve liste öğesi olarak Sayılabilir bir değer yapının alanı ya da listenin öğesi olabilir. ```kbl sayilabilir Tur: KEDI KOPEK KUS yapi Hayvan: ad = "" tur = Tur.KEDI barinak = [Hayvan("Pamuk", Tur.KEDI), Hayvan("Karabaş", Tur.KOPEK), Hayvan("Maviş", Tur.KUS), Hayvan("Tekir", Tur.KEDI)] kedi_sayisi = 0 dongu h icinde barinak: yazdir(f"{h.ad:<8}{h.tur}") eger h.tur == Tur.KEDI: kedi_sayisi += 1 yazdir(f"{kedi_sayisi} kedi var.") ``` ```cikti Pamuk KEDI Karabaş KOPEK Maviş KUS Tekir KEDI 2 kedi var. ``` > **Dikkat:** Sözlük değerleri sayılabilir tutamaz: `{"a": Tur.KEDI}` derlenmez. Böyle bir eşleme gerekiyorsa değeri bir yapının alanında tut. ## Alıştırma ```alistirma `Mevsim` adında `ILKBAHAR`, `YAZ`, `SONBAHAR`, `KIS` üyeli bir sayılabilir tür tanımla. `mevsim_bul(ay: sayi) -> Mevsim` fonksiyonu ay numarasına göre mevsimi döndürsün (12, 1, 2 kış; 3-5 ilkbahar; 6-8 yaz; 9-11 sonbahar). Verilen aylar için sonucu yazdır. %%% # buraya yaz dongu ay icinde [1, 4, 7, 10]: yazdir(mevsim_bul(ay)) %%% sayilabilir Mevsim: ILKBAHAR YAZ SONBAHAR KIS fonksiyon mevsim_bul(ay: sayi) -> Mevsim: eger ay >= 3 ve ay <= 5: don Mevsim.ILKBAHAR degilse eger ay >= 6 ve ay <= 8: don Mevsim.YAZ degilse eger ay >= 9 ve ay <= 11: don Mevsim.SONBAHAR don Mevsim.KIS dongu ay icinde [1, 4, 7, 10]: yazdir(mevsim_bul(ay)) %%% KIS ILKBAHAR YAZ SONBAHAR ```