Muhtemelen bu dil asla karşınıza çıkmayacak, Chris Stephenson un yönettiği bilgisayar bilimlerinde okumayasaydım ben de bu tür temel programlama kavramlarını öğrenmemiş olacaktım. Ama olay kavramları, bilgileri öğrenmekten öte, yaklaşımı kendi bünyenize almaya çalışmakta ve onu kendi bakış açınızla yorumlamakta bitiyor bence. Bu sebeple bugün çok da işinize yaramayacak ta ki gerçekten işinize yarayıncaya kadar olan bir bilgi vermek istiyorum. Chris bize Racket ile kod çalışmaları yaptırırken, 3. sınıfta Guiseppe diye muhtemelen kendi yazdığı bir kütüphane kullandırttı. Bu kütüphane Racket dilini biraz daha farklı yorumlamanızı sağlayan basitleştirilmiş bir dil yapıyor. İlk bakışta bir çok kısmı anlayamayabilirsiniz, programcı olsanız bile kavramsal yapı sizi rahatsız edebilir ama buradaki tüm kodlar aslında çalışabilir durumda olacak bu sebeple fonksiyonel dilleri kullanacaksanız aslında fikirler çok işinize yarayabilir. Özellikleri şunlar:
- Sabitler: sıfır, sayı-değil, doğru, yanlış
- Fonksiyonlar: sonraki, önceki, sayı?, sıfır?
- Yapılar: (λ V (...)) (eğer ... ... ...) (tanımla V ... ...)
- Değerler: "..."
- Tüm fonksiyonların sadece bir parametresi var.
Bu tek parametreli fonksiyonda parametre olarak başka bir fonksiyonu kullanma mantığı aslında çok eskilere dayanıyor. Sanırım birleşimsel mantık olarak çevirebilirim (: bunun yaratıcısı Moses Ilyich Schönfinkel adında 1889 doğumlı rus bir matematikçi. Gereksiz birleşmelerin, bağlayıcı değişkenlerin ilk düşmanı gibi bir şey diyelim şimdilik, daha sonra bu mantık Haskell Curry ve Frege tarafından kullanılmıştır. Temel olarak, eğer bir fonksiyon için 2 parametreye ihtiyacımız var ise ancak bir tanesine izin verilmişse ne yapabiliriz? ((f x) y) Bir parametresi olan bir fonksiyonun sonucu da başka bir tek parametre alan fonksiyon olursa bu işimizi görür.
Önce sayıları tanımlayalım:
(tanımla BİR (sonraki sıfır))
(tanımla İKİ (sonraki BİR))
(tanımla ÜÇ (sonraki İKİ))
(tanımla DÖRT (sonraki ÜÇ))
Şu kadar defa tanımlaması ve kullanım örnekleri. Görüldüğü üzere sonuçlar da içiçe liste şekline geliyor:
(tanımla n-defa (λ n (λ f (λ x (eğer (sıfır? n) x (f (((n-defa f) (önceki n)) x )))))))
- (((n-defa ÜÇ) sonraki) sıfır) bunun sonucu: (s (s (s sıfır)))
- (((n-defa sonraki) DÖRT) sıfır) bunun sonucu: (s (s (s sıfır)))
- (((n-defa önceki) ÜÇ) DÖRT) bunun sonucu: (s sıfır)
Şimdi matematiksel işlemleri tanımlayalım:
(tanımla topla (n-defa sonraki))
(tanımla çıkart (n-defa önceki))
(tanımla çarp (λ n (λ m (((n-defa (topla m)) n) sıfır))))
(tanımla üstü (λ n (λ m (((n-defa (çarp m)) n) BİR))))
Knuth: m üzeri m üzeri m üzeri m üzeri m işleminde kaç tane m üzeri işlemi yapılıyorsa ona n diyelim:
(tanımla knuth (λ n (λ m (((n-defa (üstü m)) (önceki n)) n))))
Bölme işlemi ise biraz sıkıntılı ama dediğim gibi buradaki yapıların kolayca anlaşılacağını düşünmediğim için burada bırakıyorum zira ben de kolayca anlamadım ki işler diğer fonksiyonlara geçtiğimizde filan iyice yorucu hale geliyor. Belki başka bir yazı ile daha sonra devam ederim çünkü işin matematik kısmı sizi büyülemeye başladığı zaman bunların hepsi gerçekten eğlenceli hale geliyor bence.