Her Şey Bir Fonksiyondur: David Beazley ve SICP Dersine Dair Notlar
(ezzeriesa.notion.site)David Beazley ve SICP dersine dair notlar: 1 haftalık deneyim
2022'nin sonunda David Beazley'nin SICP dersine katılma deneyimini paylaşıyorum. Pek çok ücretsiz kaynak var, ancak Dave'in dersi belirli konuları seçip derinlemesine açıklayarak oldukça etkiliydi.
Başlangıç noktası
SICP dersi Scheme diliyle yürütüldü; burada ise temel kavram olan yerine koyma (substitution) modelini açıklamak için Python ile basit bir Scheme yorumlayıcısı geliştirildi.
Scheme dilinin temelleri
- Primitive: temel değerler (ör. tamsayılar)
- Operatörler:
+,-,*,/gibi temel işlemler önek gösterimiyle kullanılır - define: değişken tanımı
> (define x 2)
> (+ x 3) ; sonuç: 5
- if: koşul ifadesi
- lambda: anonim fonksiyon tanımı
> ((lambda (x) (* x x)) 3) ; sonuç: 9
Python'da Scheme yorumlayıcısı
Scheme kodunu değerlendiren basit bir yorumlayıcı Python kullanılarak geliştirildi. Temel işlemler Python fonksiyonları olarak tanımlandı.
definitions = {
"+": lambda x, y: x + y,
"*": lambda x, y: x * y,
}
Örnek:
> evaluate(("+", 2, 3)) # sonuç: 5
Buna define ve lambdanın uygulanışı ile koşul ifadesi ifin işlenmesi de dahildi.
Yerine koyma modeli (Substitution Model)
Yerine koyma modeli, basit programları yorumlamanın bir yoludur; program değerlendirilirken değişkenler değerleriyle değiştirilir. Ancak atama (assignment) işin içine girdiğinde bu model başarısız olur.
Durum (State)
Yerine koyma modelinin bozulmasına örnek olarak atama (assignment) verilebilir. Örneğin bir banka hesabı bakiyesini modellenirken değişkeni güncellemek için set! kullanılır.
(define balance 100)
(define (withdraw amount)
(set! balance (- balance amount))
balance)
Bu durumda yerine koyma modeli, önceki ve sonraki bakiye durumlarını ayırt edemez.
Bu yüzden ortam (Environment) modeline ihtiyaç doğar. Değişkenler ortam içinde tanımlanır ve her prosedürün kendine ait bir ortamı vardır.
Akışlar (Streams)
Durumu modellemenin bir başka yolu da streams kullanmaktır. Streams, tembel değerlendirme (lazy evaluation) sayesinde gelecekteki değerleri de modelleyebilir.
Sonsuz döngü ve değerlendirme sırası
Değerlendirme sırasındaki fark: Çoğu dil, argümanları önce değerlendirerek applicative-order evaluation kullanır.
> (square (+ 1 2)) ; sonuç: 9
Buna karşılık normal-order evaluation, argümanların değerlendirilmesini gerçekten ihtiyaç duyulana kadar erteler. Bu sayede sonsuz döngüden kaçınılabilir.
> (define (p) (p))
> (define (test x y) (if (= x 0) 0 y))
> (test 0 (p)) ; normal order'da 0 döner, applicative order'da sonsuz döngü
Lambda kalkülüsü ve Church sayıları
Church encoding sayesinde sayılar prosedürler olarak ifade edilebilir. Bu, fonksiyonel programlamanın önemli kavramlarından biridir.
(define (zero f) (lambda (x) x))
(define (increment n) (lambda (f) (lambda (x) (f ((n f) x)))))
zero, argümanını olduğu gibi döndüren bir fonksiyondur (identityfonksiyonu).increment, fonksiyon çağrısını bir kez daha uygular.
Örnek
> ((zero (lambda (x) (+ x 1))) 0) ; sonuç: 0
> (((increment zero) (lambda (x) (+ x 1))) 0) ; sonuç: 1
İterasyon vs özyineleme
Scheme, for döngüsü yerine tekrar eden işleri yapmak için özyineleme kullanır.
Özyineleme örneği: faktöriyel
(define (factorial n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
Bu özyinelemeli çağrı, stack kullandığı için fazla bellek tüketebilir.
Kuyruk çağrısı optimizasyonu (Tail-call optimization)
Scheme, tail-call optimization sayesinde bellek kullanımını azaltır. Bu da onun yinelemeli (iterative) bir süreç gibi çalışmasını sağlar.
(define (factorial n)
(define (iter product counter)
(if (> counter n)
product
(iter (* product counter) (+ counter 1))))
(iter 1 1))
Kapanış
David Beazley'nin dersi, SICP'nin ana kavramlarını seçip derinlemesine ele alıyor. Özellikle fonksiyonel programlama, lambda kalkülüsü ve değerlendirme sırası gibi farklı programlama paradigmalarını anlamaya yardımcı oluyor.
Knuth'tan alıntı
Yalnızca teori çalışıyorsanız, bu pratik tarafa odaklanma zamanınızın geldiği anlamına gelir; yalnızca pratik yapıyorsanız da teoriye odaklanma zamanınızın geldiği anlamına gelir.
1 yorum
Hacker News görüşü
SICP dersi bilgi yoğunluğu yüksek, ancak öğrencilerin Soru-Cevap bölümleri ve tahtanın kullanımı gibi nedenlerle çok zaman alıyor. Ders sırası da yeniden yapılandırılabilir gibi görünüyor. Kişisel olarak yeni bir video serisi planlanıyor
Durumun saf fonksiyonlar olarak nasıl kodlanacağı tanıtılıyor. Çeşitli veriler için saf işlevsel kodlamalar mevcut
Blog gönderisinin URL anchor/hash yapısı nedeniyle doğrudan postscript bölümüne gidildiği için kafa karıştırıcıydı
cons/car/cdr'nin lambda ile uygulanmasını ilk gördüğümde sihir gibi gelmişti. Bu, dil çalışma zamanının anahtar/değer sözlükleri uygulamak zorunda olduğunu gösteriyorDavid Beazley, Python dünyasında efsanevi bir figür ve bu ders başta şaşırtıcı gelse de kısa sürede mükemmel bir eşleşme gibi görünmeye başlıyor. Bir sonraki derse kayıt olundu
İndüktif veri tiplerine ihtiyaç duyulduğu fikriyle karşılaşıldı. Yalnızca Church encoding ile
0 != 1gibi teoremleri kanıtlamak mümkün değilYazının kendisi ilgi çekiciydi, ancak sayfada gezinmek zordu. Klavye ok tuşlarıyla kaydırma yapılamıyordu
"Substitution Model" bölümündeki kodda bir yazım hatası var.
fibyerinefibonaccikullanılmalı. GitHub deposundaki kod doğruKitapla ilgili devam eden bir tartışmanın bağlantısı var. Bağlantının neden doğrudan sayfanın altındaki tartışmaya götürdüğü merak ediliyor. Bunun başka bir tartışmayla birleştirilip birleştirilemeyeceği de merak ediliyor
YouTube bağlantısı sağlanmış