Gelin Hep Birlikte Kodlayalım Çağrısı

0
FZ
Aycan İrican'ın cs-lisp e-posta listesine attığı bir e-postaya dikkat çekelim:

Selam,

Nasıl anlatabilirim bilmiyorum ama, bu listede common lisp programlama yapmak isteyen var mı acaba? Bir grup kütüphane ve buna bağlı bir web sunucu yazdık biz.
Bunlara ayrıştırıcıların kolay birleştirilebilmesini sağlamak (parser combinators diye geçiyor sanırım literatürde, bunu volkan bir projesinde kullanmıştı, bkz. "aliw"), akışlar ile programlama (stream processing olarak geçiyor ancak bizim şimdilik yaptığımız genel bir akış modeli ortaya koymak oldu, kontrol noktaları belirleyebiliyor ve hata durumunda bu noktalara geri sarabiliyoruz akışı, ve tabi türlü veri tiplerini akışa çevirebiliyoruz), iş parçacıkları ile programlama (threaded programming diye geçiyor olmalı) ile birden fazla işlemci çekirdeğini kullanabiliyoruz. Bunları birleştirince fena kodlar çıkmadı.

Yani karakter dizisinden, veri tipine, veri tipinden ise karakter dizisine dönüşümleri sağlayan "parser" ve "render" yazabiliyoruz bunlarla. Örnek vermek gerekirse (zom: zero-or-more, :fixnum? ise diğer bir ayrıştırıcı v.b.):


(defrule version? (version d)
    (:fixnum? d) (:do (push d version))
    (:zom #\. (:fixnum? d) (:do (push d version)))
    (:return (nreverse version)))

(defrule http-protocol? (version)
  (:seq "HTTP/") (:version? version)
  (:return (list 'HTTP version)))



Http başlığındaki sürüm bilgisini bu iki (ve ilkel diğer birleştireçler) ayrıştırıcının birleşmesi sonucu ayıklıyoruz akış içerisinden.


SERVER> (with-core-stream (s "HTTP/1.1")
          (http-protocol? s))
(HTTP (1 1))



Ayrıştırıcılar lisp dünyasının temel veri tipi olan anlamlı listeler dönüyor gördüğünüz gibi. Bunun tersi olan işlem ise liste tiplerini karakter dizisi olarak ifade edebilmeyi sağlayan betimleyiciler. Bizim rfc2616 gerçekleştirimimizin testlerinden buna bir örnek vermek gerekirse:

(deftest http-location!
    (with-core-stream (s "")
      (http-location! s (make-uri :scheme "http"
                                  :username "john"
                                  :password "foo"
                                  :server "127.0.0.1"
                                  :port 8080
                                  :paths '(("test") ("me") ("up.html"))))
      (equal (return-stream s)
             "http://john:foo@127.0.0.1:8080/test/me/up.html"))
  t)

Burada betimleyicinin karmaşık bir liste alması yerine daha basit bir veri yapısı kullanıldığını görüyorsunuz (uri sınıfı). Bu veri yapısını akışa yazan bir test, ve akıştaki veriyi alıp olması gereken karakter dizisi ile karşılaştırıyoruz.

Bu akışlar ve bunların üzerinde çalışan ayrıştırıcılar oldukça faydalı. HTTP belirtimini okuyup sırasıyla bütün BNF'yi gerçekleştirebiliyoruz (bunun benzeri ve hatta daha kuvvetli olanı haskell'de parsec, ve BNF'den doğrudan ayrıştırıcı yaratan happy var).

Bahsedebileceğim diğer bir özellik ise iş parçacıklarını kolay kullanabilmemizi sağlayan kodlar. Örneğin sunucumuz için gerekli olan basit kayıt defteri aşağıdaki gibi programlanabiliyor.


(defclass logger-server (local-unit)
  ((log-stream :accessor log-stream :initarg :log-stream :initform nil)
   (log-path :accessor log-path :initarg :log-path
             :initform (default-log-path))))

(defmethod/unit log-me-raw :async-no-return ((self logger-server) message)
  (string! (log-stream self) message)
  (char! (log-stream self) #\Newline))



İşin güzel yanı burada iş parçacığına özel bir programlama görmüyorsunuz. Ancak logger-server sınıfından bir örnek yaratıp çalıştırdığınızda (bunun bir start metodu var) diğer iş parçacıkları log-me-raw adlı metodu eş zamanlı olarak çağırabiliyor ve sihirli bir şekilde bu çağırımlar girişmeden, sıralı olarak işliyor.


SERVER> (defparameter *logger1* (make-instance 'logger-server
:log-stream *standard-output*))
*LOGGER1*
SERVER> (start *logger1*)
NIL
SERVER> (log-me-raw *logger1* "core.gen.tr iz c00l")
core.gen.tr iz c00l



Bunu 40 iş parçacığıyla test edince çıktının tertemiz olduğunu görebiliyoruz:


(defparameter *logger* (make-instance 'logger-server))

(defclass my-worker (local-unit)
  ((id :accessor id :initarg :id)))

(defmethod/unit logmeup :async-no-return ((self my-worker))
  (log-me *logger* (format nil "I'm here as number ~D" (id self))))

(defparameter *workerz* (loop
                           for i from 1 to 40
                           collect (make-instance 'my-worker :id i)))

(defun setup-loggerz ()
  (start *logger*)
  (mapcar #'start *workerz*)
  (mapcar #'logmeup *workerz*)
  (mapcar #'stop *workerz*)
  (sleep 5)
  (stop *logger*))



Bunların yanında bir de sürdürmeleri kullanan web sunucumuz var artık. Eskiden ucw kullanıyorduk ancak küfür ede ede onu bıraktık şimdi daha işlevsel olmasını istediğimiz yeni bir sunucu bileşeni yazıyoruz. Sunucu doğal olarak ucw+ gibi ajax desteklesin istedik, ve şu an yavaş yavaş yeni sunucu altyapısı oluşuyor.

Sonuç olarak bu kodlara göz atmak isteyenler aşağıdaki adresi kullanabilirler:

http://www.core.gen.tr/projects/core-server/

Sunucuyu kurmak isteyenler aşağıdaki bağlantıdaki kurulum paketini kullanabilirler. Kurulum paketi bütün bağımlılıkları internet üzerinden indirip derleyen bir paket. Bu pakette de betiklerde çoğunlukla karşımıza çıkan "command pattern" için bir çözüm bulmanız mümkün.

http://www.core.gen.tr/projects/core-server-installer-latest.tar.gz

Tekrar söylemekte fayda görüyorum, bize common lisp ile çalışabilecek deneyim sahibi katılımcılar lazım. Şu an çalışmanın büyük bir bölümünü Evrim ULU yürütüyor. Zaten çoğu gerçekleştirim de ona ait. Çevrenizde common lisp programlama yapmak isteyen birileri varsa ve bu anlattığım konularla ilgilenmişse lütfen bize ulaşmalarını sağlayın. Katılmak isteyenler doğrudan erişmek için IRC sunucumuza da gelebilirler.

irc.core.gen.tr:7000

Lütfen gelin, nolur gelin, geldirin, ettirin, katkı sağlayın.

Sevgiler...
--
aycan

_______________________________________________

cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Görüşler

0
inoxus
Yıllar önce, iş başvurusu için yanına gittiğim bir inşaat mühendisi bana LISP biliyor musun diye sormuştu. "Hayır" dedim. Ceketinin cebinden katlanmış bir deste kağıt çıkardı. (Adam cebinde lisp kodları taşıyor). Kağıtları açıp yazılanları gösterdi, "Birşey ifade ediyor mu bunlar sana?" diye sordu. Daha önce elbette ki lisp kodlarını görmüştüm ama "Hayır" dedim yine. Nereden bilirdim ki, ilk ve son iş görüşmemin LISP bilmediğim için başarısızlıkla sonuçlanacağını. 2005 yılında olmuştu bu olay, şimdi 2007 ve hala LISP bilmiyorum. Okuldan ayrılmam nedeniyle 15 aylık askerliğime yakında başlıyorum. Döndüğüm zaman da artık LISP öğrenmek istiyorum. Aynı şey tekrarlanırsa çok üzüleceğim.
0
FZ
Döndüğünüz zaman kaynaklar sizi bekliyor olacak. Bu arada LISP değil de Lisp diyoruz, Common Lisp, AutoLisp yahut Scheme, vs.
0
erhanbaris
LISP olarak okursakta anlasilaz mi :P
0
FZ
En hafif tabiri ile 'arkaik'. Daha ciddi açıdan bakılacak olursa, tam olarak neyden bahsettiğiniz anlaşılmaz, Common Lisp mi, Scheme mi, AutoLisp mi, Emacs Lisp mi, ...? Yoksa genel olarak dil ailesi mi, vs.
0
Tarık
Autodesk Autocad yazılımının kendine özgü bir lisp türü kullandığını biliyorum. Hatta bir arkadaşımın tüm *.lisp dosyalarına(muhtemelen script) virüs bulaşmıştı. lisp lisp common lisp :) (bir zamanlar tv lerde java java deyü dolaşan, lisp diyeceğine lipis diyen biri vardı. Kimdi yahu o?)

Cümleten mutlu bayramlar efendim...
0
eevrim
Adreste aciklayici epostayi okuyabilirsiniz:

http://common-lisp.net/pipermail/bese-devel/2007-December/003147.html
0
zekzekus
çeşitli iyileştirmeler içeren kurulum betiğinin yeni adresi şöyle: http://labs.core.gen.tr/repos/core-server-installer-latest.tar.gz
İlgililere duyurulur.
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Core Services Projesi Duyuruldu: Gönüllü Common Lisp Programcıları Davetli

FZ

Tam da az önce FZ Blogs ortamında Türkiye’deki ticari BT ortamında Common Lisp platformunun yerinden bahsediyordum ki cs-lisp e-posta listesine gelen "Core Services" projesi başlıklı e-posta dikkatimi çekti. COR3 ekibinden Aycan İrican şöyle demiş:

Geçen aylarda yazdığımız bir web uygulamasının sonucu olarak, birtakım servisleri uygulamadan ayırarak bir genel kütüphane yazmayı planlıyoruz. Bu nedenle common-lisp.net üzerinde bir proje açtık.

Lisp Resource Kit: Canlı Canlı Lisp ;-)

FZ

LispNYC ve ALU tarafından geliştirilmiş olan The Lisp Resource Kit boot edebilen Debian GNU/Linux tabanlı Knoppix kullanılarak hazırlanmış bir Lisp tanıtım, eğitim öğretim CDsi. Her türlü deneyimden insana Common Lisp programlama dilini ve teknolojilerini tanıtmak amacı ile hazırlanmış ve ekran görüntülerine buradan ulaşabileceğiniz bu CDdeki yazılımların birkaçına örnek vermek gerekirse:

Common Lisp ve Bir Optimizasyon Tekniği: Memoization

FZ

"Memoization" tabiri bilgisayar bilimlerinde ilk kez Donald Michie'nin 1968 yılında Nature dergisinde yayımlanan Memo functions and machine learning (Memo fonksiyonları ve makina öğrenimi) makalesi ile gündeme gelmiştir.

Memoization tekniği bir fonksiyonu hesaplarken önceden hesaplanmış değerleri hesaplamadan kullanmak, dolayısı ile işlemi hızlandırmak olarak tarif edilebilir. Sözcük olarak "memorization"ı yani "ezberleme" eylemini çağrıştırmakla birlikte daha genel bir anlamı kapsamaktadır.

Programlama dilinden bağımsız olmakla birlikte, bu yazıda "memoization" tekniğinin Common Lisp'te nasıl kullanılacağına bakacağız. Bunun için Peter Norvig'in PAIP kitabı ana eksenimizi oluşturacak.

Ünlü Bir Microsoftçunun Lisp Aşkı

FZ

Yazdığı kitaplarla Microsoft ortamlarında programlama yapanların yakından tanıdığı ve davet üzerine bir süredir Microsoft'ta çalışan Don Box, son yazılarından birinde "Scheme Is Love" başlığı ile konuya girmiş ve Scheme'e olan aşkını itiraf etmiş.

Lisp ile TILSIMLI ve Renkli Programlama: Lisperati

FZ

Tüm zamanların en renkli Common Lisp programlama kılavuzlarından Lisperati artık anadilimizde.

Söz konusu belge İstanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü öğrencisi Seda Çelebican tarafından Türk diline çevrildi. Belgenin Türk kültürüne uyarlanmasında ve genel editörlük işlemlerinde İstanbul Bilgi Üniversitesi eMBA Yazılım Geliştirme ekibinden Emre Sevinç emek harcadı. Bu süreçte çok titiz eleştirileri, geri beslemeleri ile bize yardımcı olan Bilkent Bilgisayar Mühendisliği bölümü öğrencilerinden Hayrettin Gürkök'e ve Lisp konusunda yardımcı olan Bülent Murtezaoğlu'na teşekkürü bir borç biliriz. Belgedeki hatalardan çevirmen ve editör sorumludur. Orjinal belgenin yazarı Dr. Conrad Barski hiçbir maddi hatadan ötürü sorumlu tutulamaz. Belgeyle ilgili tartışma ve her türlü soru için bu haberin altına yorum yazabilir, iletişim kurabilirsiniz.

Lisperati belgesindeki kodları denemek için hiçbir şey kurmanıza gerek yok. Belgede anlatıldığı gibi uzaktaki bir telnet servisine kolayca bağlanıp kodları hemen derleyebilirsiniz ancak bu konularla daha ciddi ilgileniyor ve kendi Lisp ortamınızı kurmak istiyorsanız daha önce FM'de yayınlanan Common Lisp Geliştirme Ortamı Kurulumu kılavuzundan faydalanabilirsiniz.

Güncelleme (2/5/2005): Kılavuzu PDF olarak hazırlayıp Ayhan Barış'a çok teşekkür ederiz.