İçeriğe geç

Kitaplar / Yöntem ile Programlamaya Giriş / Bölüm 8 — Fonksiyonlar değer olarak: lambda ve boru işleci

Bölüm 8 — Fonksiyonlar değer olarak: lambda ve boru işleci

Yöntem’de fonksiyonlar sıradan değerlerdir: bir değişkene konabilir, başka bir fonksiyona verilebilir. Bu özellik veri işlemede, özellikle yapay zekâ programlarında çok kullanılır.

Yöntem
program Fonksiyonel
değişken
  sayılar, kareler, çiftler: liste
  genelToplam: tamsayı
  kişiler: liste
  kare: herhangi

fonksiyon Sayaç: herhangi
değişken
  n: tamsayı
başla
  n := 0
  dön fonksiyon başla n := n + 1; sonuç := n; bitir
bitir

değişken s: herhangi

başla
  sayılar := [1..10]
  kare := fonksiyon(x) => x * x             // isimsiz fonksiyon (lambda)
  yaz('kare(7)  = ' + Çağır(kare, 7), 1)

  kareler := Eşle(sayılar, kare)
  çiftler := Süz(sayılar, fonksiyon(x) => x mod 2 = 0)
  genelToplam := İndirge(sayılar, fonksiyon(a, b) => a + b)
  yaz('Kareler  : ' + kareler, 1)
  yaz('Çiftler  : ' + çiftler, 1)
  yaz('Toplam   : ' + genelToplam, 1)

  // boru işleci: soldaki değer, sağdaki fonksiyonun ilk argümanı olur
  yaz('Boru     : ' + (sayılar |> Süz(fonksiyon(x) => x > 5) |> Eşle(kare) |> Toplam), 1)

  kişiler := [['ad': 'Can', 'yaş': 31], ['ad': 'Ada', 'yaş': 24], ['ad': 'Ege', 'yaş': 28]]
  yaz('Yaşa göre: ' + Eşle(Sırala(kişiler, fonksiyon(k) => k['yaş']), fonksiyon(k) => k['ad']), 1)

  s := Sayaç                                // kapanış: n değişkenini hatırlar
  Çağır(s);  Çağır(s)
  yaz('Sayaç    : ' + Çağır(s), 1)
bitir.
Çıktı
kare(7)  = 49
Kareler  : [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Çiftler  : [2, 4, 6, 8, 10]
Toplam   : 55
Boru     : 330
Yaşa göre: ['Ada', 'Ege', 'Can']
Sayaç    : 3
Araç Ne yapar?
fonksiyon(x) => ifade Tek ifadelik isimsiz fonksiyon
fonksiyon(x) başla … bitir Gövdeli isimsiz fonksiyon
Eşle(L, f) Her elemana f uygular, yeni liste döndürür
Süz(L, f) f doğru döndüren elemanları tutar
İndirge(L, f) Elemanları ikili ikili birleştirerek tek değere indirir
Sırala(L, anahtar) Anahtar fonksiyonunun sonucuna göre sıralar
x \|> f(y) f(x, y) ile aynıdır; işlem zincirleri soldan sağa okunur
Çağır(f, ...) Değişkende duran bir fonksiyonu çağırır
@Ad Adı verilen fonksiyonu çağırmadan değer olarak alır

Kapanış (closure): Sayaç içinde üretilen lambda, n yerel değişkenini “hatırlar”. Her çağrıda aynı n artar.

Dikkat: Bu örnekte değişkene toplam yerine genelToplam dedik. Yöntem büyük/küçük harf ayırmadığı için toplam adı yerleşik Toplam fonksiyonunu gölgelerdi; boru zincirindeki |> Toplam çalışmazdı. Bu nedenle değişkenlere yerleşik işlevlerin adlarını vermemek gerekir.

Alıştırmalar

  1. Bir metindeki ünlü harfleri (a, e, ı, i, o, ö, u, ü) sayan ÜnlüSayısı(s: metin): tamsayı fonksiyonunu yazınız.
  2. Fibonacci sayılarının ilk 15’ini bir listede toplayınız; sonra boru işleciyle yalnızca çiftleri süzüp toplamını yazdırınız.
  3. Öğrenci adlarını ve notlarını bir sözlükte tutunuz; notu 70’in üzerinde olanları alfabetik sırayla yazdırınız.