Paradigma değişikliği

C'de kod yazarken fonksiyon içinde fonksiyon tanımlamanın yasaklı olması en başta bana çok saçma gelmişti. Birçok diğer dilde olduğu gibi ezberci sistem gereği üstüne gitmedik ve o şekilde öğrendik. Ama hep aklımı kurcalıyordu. Niye fonksiyon içine fonksiyon yazamıyorum ki? Buna yönelik birkaç tane kendimin geliştirdiği teoriler bile vardı. En mantıklısı; C dili programcıyı modüler geliştirme tekniğine zorluyordu. Yani fonksiyonları iç içe değilde farklı yerlerde tanımlayarak yazıp, gerektiği yerlerde kullanmamızı istiyordu. Ama bu benim düşüncemdi ve eksik yanları vardı.

Lisp Programlama Dili

Bunun yanında bazı dillerde de hep duyduğum birşey vardı. Global değişken kullanmak zararlıdır, tehlikelidir. Ama hiçkimse de çıkıp neden böyle olduğunu anlatma gereği duymamış. Birkaç yerde anlatılanlar var ama onlarda sadece işin güvenlik tarafından bahsetmişler. Sorunun asıl kaynağını anlatmamışlar veya anlatamamışlar.

Tabi programlama dilleri ile bunun gibi birçok sorum ve problemim vardı. Ama bunları kafamdan bir süre uzaklaştırıp sanki yokmuş gibi düşünüp kodlarımı yazıyordum. Ama felsefem gereği yaptığım işte sistemin en altında da neler döndüğünü bilmek isterim. Bu yüzden yokmuş gibi davranmak pek bana göre değil.

Aklımda böyle sorular varken derslerini çok sevdiğim Chris Stephenson'un izlemediğime bin pişman olduğum aşağıdaki videosu ile karşılaştım. Normalde bu kadar uzun video izleyen birisi değilim. Bir zaman sonra beni sıkıyor ve hızlı hızlı geçmeye başlıyorum. Ama ilk defa bir videoda böyle yapma gereği duymadım. Sonuna kadar pür dikkat dinledim. Yukarda yazdığım ve aklıma takılan sorunların birçoğundan videoda bahsediyordu. Bittiğinde izlediğime gerçekten pişman olmamıştım. Size tavsiyem ne kadar uzun olursa olsun sonuna kadar izleyin.

Videoyu izledikten sonra kafamda ilginç şeyler belirmeye bazı problemlerinde ardındaki sis perdesi aralanmaya başladı. Birçok dilin aslında yaratıcılığımızı nasıl engellediğini düşündüm. Bize bir özgürlük alanı veriyorlardı ama bu alan gerçek özgürlüğün içinde büyük bir hapishaneymiş meğer.

Yukarıdaki videoyu izledikten sonra bir süredir aklımda yer alan Lisp ailesinden bir dil öğrenme fikrini hemen gerçekleştirmek istedim. Benim bu dilimi öğrenmemdeki amaç kesinlikle ilerde bana iş olanağı açacağı veya popüler olduğu için değil, gerçekten bana programlama adına birşeyler öğretmesi istediğimdendi. Tamam Python'da kesinlikle bana bu tarz birşey sağlıyordu diye öğrendim. Ama Python ve diğer dillerden aşina olduğum tarzdan yani bu dillerin paradigmalarından biraz kurtulmak istiyordum. Açıkcası bunların hepsi beni fonksiyonel programlamaya doğru çekiyordu. Ve bu fonksiyonel programlama dilinin Lisp ailesinden olmasını istiyordum.

Bildiğiniz gibi Lisp 1958 yılında icat edildiğini için günümüzdeki en eski dillerden birisi. Bu kadar köklü geçmişi olmasından dolayıda haliyle çok fazla dallanıp budaklanmış. Birçok lehçesi çıkmış. Buraya dikkat. Lehçe diyorum ama bunların hepsi başlı başına bir dil. Lisp'in ne kadar köklü olduğunu anlamışınızdır.

Günümüzde hala Common Lisp, Scheme, Clojure, Emacs Lisp lehçeleri çokca kullanılıyor. Ben de bu lehçelerden birisini seçip öğrenmek istiyordum ama hangisine seçeceğime bir türlü karar veremiyordum. Bu konuda bir uzmana danışmak gerekiyor diye düşündüm ve Türkiye'de bana göre Lisp deyince aklıma gelen kişi olan Emre Sevinç abiye mail attım. Ve kendisi bana inanılmaz kısa bir sürede geri döndü ve yapacağım seçimde belirleyici rol oynadı. Bana söylediği seçim aşamasındaki kısmı aynen atıyorum.

  • Common Lisp: Buyuk bir dil. Emacs + SLIME (+HyperSpec, CLtL2, lispdoc, vs. ile muazzam yetenekli ve güçlü bir gelistirme ortami sunuyor ama o ortamin hakkini vermek için iyi ögrenmek, iyi ögrenmek için de sakin kafa ile epey vakit ayirmak sart. Bu aralar http://www.quicklisp.org/ gibi araçlar sayesinde epey farkli kitapliga kolayca erisip kurmak mümkün.

  • Scheme: Burada bir iki farkli durum var, klasik Scheme ile mesela SICP kitabi çalisilabilir, zordur, ufuk açar ama zordur.

Yahut: Cok yogun sekilde gelistirilen Dr.Racket ve http://www.ccs.neu.edu/home/matthias/HtDP2e/ ile hem eglenceli bir gelistirme ortamina, hem de gayet iyi bir kitaba kavusmak, duzenli bir calisma ile birkac ayda epey sey ögrenmek mümkün.

Dr.Racket'in kitaplik zenginligi ne durumda, bilemiyorum acikcasi son durumlari.

  • Clojure: 'a strange beast'. Hiç kullanmadim. Yani Lisp'e ve fikirlere, ufuk genislemesine odaklanacaksam önce CL ya da Scheme tercih ederim. Ayrica Clojure'un REPL ortami Emacs+SLIME yahut Dr.Racket ile ne kadar boy ölçüsebilir, süpheli. Diger yandan Java ve JVM dünyasinin ezici bir yayginligi, muazzam bir kitaplik destegi var. Yani gelistiren Lisp kodunu bir sekilde baska sistemlerle entegre etmek gerekirse Clojure illa ki avantajini belli edecektir diye tahmin ediyorum.

Bu söylediklerinden sonra birinde karar vermem gerekiyordu. Açıkcası önümde birkaç kapı var ve hangisini seçersem seçeyim bana birşeyler katacağından emindim. Belkide en güzel karar vermelerden birisi buydu. Birini seçtiğimde pişman olmayacaktım. Lisp'in syntaxına ve getirdiklerine aşina olacaktım ya o bana yeterdi.

Ve ben bunca düşünme ve karar verme aşamasından sonra tercihimi Clojure'dan yana kullandım. Neden derseniz öyle kısa veya uzun bir cevabı yok. Birini seçmek zorundaydım. Ben hem yeni(2007) hem de eskinin mirasını alan birşey istiyordum. Clojure bu tanıma uyuyordu. Hatta Clojure hep uzak durduğum Java dünyasına da beni yakınlaştırabilir diye düşünüyorum. Çünkü Clojure ile yazdığım kodlar direk Java içinde, Java içinde yazılan kodlar da direk Clojure içinde kullanılabiliyor. Mesela büyük bir Java uygulamanız ve kodunuz varsa bunun içinde sorunlu ve performans gerektiren bazı işleri Clojure ile yazıp direk o sistemin parçası edebiliyorsunuz. Gerçekten çok iyi birşey bu.

Artık hem Lisp syntaxını ve getirdiklerini öğreniyordum hem de arkama yılların tecrübesi ve gayet büyük Java dünyasını alıyordum. Gerçekten bu iş için biçilmiş kaftan oldu Clojure. Ve bu gazla bundan sadece 2 gün önce ilk kanı döktüm ve Clojure çalışmaya başladım. Başladıktan bu yana beni gerçekten içine çektikçe çekti. Şu anda aklımda birton proje oluştu bile diyebilirim. Zaten çoğu soruma cevapta buldum. Bunlar benim için gerçekten yeterliydi. Şimdi de elimdeki algoritmalar kitabındaki çoğu problemi Clojure ile gerçeklemeyi düşünüyorum. Hem algoritmalar ile uğraşıcam hem de yeni bir dil ile. Çok güzel bir anlaşma oldu bu.

Bu yazının bir amacı artık programlama dünyasına farklı baktığımı göstermek içindi. Bir diğeri ise Clojure ile ilgili yazıları bundan sonra blogumda bolca bulabileceğiniz içindi. Tabi bir de artık her gördüğüm matematiksel problem ve algoritmayı gerçekleme fikrim var. Bu da ilerde dönüp baktığımda bana güzel bir anı olması için.

Clojure

Özetle en azından bir fonksiyonel programlama dili bilmeye çalışın. Mümkünse Lisp ailesinden olsun olmazsa da önemli değil zaten çoğunun kökeni aynı yere gidiyor. Hatta zamanınız varsa Lambda Calculus neymiş ne değilmiş diye araştırın. Sadece 3 tane kuralı olan bu programlama dili ile yapılanları gördükçe benim hissettiklerimi sizde hissedeceksiniz. Geç değil yapın bunu. Hatta buyurun buradan başlayın.

Önce şu yazıyı ardından da bu yazıyı okuyarak fonksiyonel programlama konusundaki ilk atılımı yapabilirsiniz. Bundan sonra uygun dili seçip ufkunuzu açın derim.(Lisp ailesinden seçin farkı yaşayın)

comments powered by Disqus