9. Konsol uygulaması
Uçbirimde çalışan, argüman alan, girdi okuyan program. KabaLang'in en hafif uygulama türüdür: ek kütüphane gerektirmez, ikili birkaç on kilobayttır.
Hazır iskelet: kabalang yeni <ad> --konsol
(13. sayfa).
En küçük konsol programı
kullan kaba.sistem
fonksiyon ana():
yazdir("=== Rapor ===")
yazdir("makine: " + sistem.makine_adi())
don 0
ana()Komut satırı argümanları — KomutSatiri
Bayrakları elle ayrıştırmayın. KomutSatiri tanımdan --yardim metnini
de kendiliğinden üretir.
kullan kaba.sistem
ks = KomutSatiri("selam", "Girdiyi okur, isterse karakterlerini sayar")
ks.secenek("kisi", "k", "Selamlanacak kişinin adı") # --kisi DEGER / -k DEGER
ks.bayrak("sayac", "s", "Karakter sayısını da yaz") # --sayac / -s
ks.konumsal("onek", "Çıktının başına konacak ön ek") # sıralı argüman
c = ks.coz()
# Yardım ve hata AYRI ele alınır:
eger c.yardim_mi():
c.yardim_yaz()
cikis(0)
eger c.hatali_mi():
c.hata_yaz_ve_cik() # stderr'e yazar, çıkış kodu 2
kisi = c.secenek("kisi").deger_veya("dünya")
onek = c.konumsal("onek").deger_veya("»")
yazdir(f"{onek} Merhaba {kisi}!")
eger c.bayrak("sayac"):
yazdir(f"{onek} ad uzunluğu: {kisi.uzunluk()}")| Tanım | Kullanıcı ne yazar |
|---|---|
ks.secenek("kisi", "k", aciklama) |
--kisi Ayşe ya da -k Ayşe |
ks.bayrak("sayac", "s", aciklama) |
--sayac ya da -s (değer almaz) |
ks.konumsal("onek", aciklama) |
sırayla verilen argüman |
⚠️ Tanımsız seçenek sessizce yok sayılmaz: c.hatali_mi() doğru olur,
hata_yaz_ve_cik() stderr'e yazıp çıkış kodunu 2 yapar. Kabuk betikleri
yanlış kullanımı böyle görebilir.
⚠️ Değişkene etiket adını vermeyin: etiket bir arayüz bileşeni türüdür ve
denetçi etiket = ... satırını bileşen bildirimi sanar (ölçülmüş denetçi
sınırı).
Kullanıcıdan girdi okumak
kullan kaba.sistem
# İstem yalnız gerçekten bir insan varsa yazılır — boruya yazmak çıktıyı kirletir.
eger konsol.etkilesimli_mi():
konsol.yaz("Satır yazın (bitirmek için Ctrl-D): ")
satir_sayisi = 0
iken dogru:
s = konsol.satir_oku()
eger s.bos_mu(): # ⚠️ DOSYA SONU — boş satır DEĞİL
kir
satir_sayisi = satir_sayisi + 1
yazdir(f"» {s.deger()} [{s.deger().uzunluk()} karakter]")
yazdir(f"Toplam {satir_sayisi} satır okundu.")⚠️ Dosya sonu (EOF) ile boş satır ayrı şeylerdir. konsol.satir_oku()
bir belki<metin> döner:
| Dönüş | Anlamı |
|---|---|
bos |
girdi bitti (Ctrl-D, boru kapandı) |
dolu("") |
kullanıcı yalnızca Enter'a bastı |
Bu ayrım olmasaydı yukarıdaki döngü ya sonsuza kadar döner ya da kullanıcı Enter'a basınca erken biterdi.
Sayı okumak — iki başarısızlık nedeni ayrılır
kullan kaba.sistem
eger konsol.etkilesimli_mi():
n = konsol.sayi_oku("Bir tam sayı yazın: ")
eger n.tamam_mi():
yazdir(f"Karesi: {n.deger() * n.deger()}")
degilse:
yazdir("Sayı okunamadı: " + n.hata().mesaj())
degilse:
yazdir("etkileşimli değil — okuma atlandı")konsol.sayi_oku() bir sonuc döner, çünkü iki ayrı nedenle başarısız
olabilir ve ikisi ayırt edilmelidir: girdi bitti mi, yoksa yazılan şey
sayı değil mi? Tek bir "boş" dönseydi "tekrar sor" ile "çık" ayırt
edilemezdi.
| Çağrı | Dönüş |
|---|---|
konsol.satir_oku() |
belki<metin> |
konsol.sayi_oku(istem) |
sonuc<sayi, Hata> |
konsol.ondalik_oku(istem) |
sonuc<ondalik, Hata> |
konsol.tumunu_oku() |
tüm girdi tek metin |
konsol.yaz(m) |
satır sonu EKLEMEDEN yazar (istem için) |
konsol.hata_yaz(m) |
stderr'e yazar |
konsol.etkilesimli_mi() |
girdi bir uçbirim mi (boru değil mi) |
Çıkış kodu
kullan kaba.sistem
fonksiyon ana():
eger degil dosya.var_mi("/etc/hostname"):
yazdir("beklenen dosya yok")
don 1
don 0
kod = ana()
yazdir(f"çıkış kodu: {kod}")
cikis(kod)cikis(kod) programı hemen sonlandırır. Kabuk betikleri için 0 başarı,
sıfırdan farklı her değer hatadır.
Renkli çıktı
ANSI kaçış dizileri doğrudan yazdırılabilir:
yazdir("\033[38;5;78m● yeşil\033[0m \033[38;5;220m● sarı\033[0m \033[38;5;81m● mavi\033[0m")⚠️ Renkleri yalnız konsol.cikti_etkilesimli_mi() doğruyken yazın; çıktı
bir dosyaya/boruya gidiyorsa kaçış dizileri veriyi kirletir.