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

Cusp: Eclipse için Common Lisp Eklentisi

zekzekus

Lisp ile uğraşan ama Emacs editörüne alışamamış benim gibi kullanıcıların yardımına Eclipse IDE ortamı için hazırlanmış Cusp eklentisi yetişiyor.

3D Model Tasarımı ve Mirai

FZ

Rainer Joswig, 1999 yılında Mirai ile bir model tasarlayan Bay Raitt'in çalışma seansını yansıtan bir video sunuyor.

Mirai, 3D grafik tasarımı için kullanılan bir yazılım. Common Lisp ile yazılmış ve Allegro Common Lisp üstünde çalışıyor. Yazılımın temelleri daha önceki Symbolics Graphics süitine dayanıyor.

Videoyu buradan indirebilirsiniz.

Kaynak: Planet Lisp

Video: Second Episode - 20 dakika ve 100 satırda Reddit

FZ

Video çılgınlığı devam ediyor. Bu gidişle HOW-TO belgelerinin yerini HOW-TO videoları mı alacak? İnsanlar "öğret bana usta, adım adım göster" yaklaşımını daha mı çok seviyorlar? Daha önce duyurduğumuz videoyu yapan Sven Van Caekenberghe'nin Episode 2: (Re)writing Reddit in Lisp is 20 minutes and 100 lines videosu taze taze, sıcak sıcak kamuya sunuldu.

UnCommon Web ile “Merhaba Dünya”

FZ

Ne zamandır fırsat bulamadığım UnCommon Web geliştirme çatısı ile bir kaç deneme yapabildim sonunda. Kurcalamaya başlamak için önce UCW’yi kurmam gerekti doğal olarak. Oldukça fazla sayıda olan bağımlı olduğu paketleri tek tek kurmak yerine şu adresten UCW-boxset paketini indirdim. Windows sistemimde çeşitli hatalar aldığımdan sanal makine üzerindeki Debian sistemime kurdum. Kurdum derken ev klasörümde arşiv dosyasını açtım sadece. Gerisi UCW-boxset klasöründeki “start.lisp” dosyasını Lisp sistemine yüklemekten ibaret zaten. Veritabanı erişimi için (malum web programlama veritabanı olmadan olmaz) clsql paketini kullandım...

Zekeriya Koç'un Common Lisp ile geliştirilmiş UnCommon Web uygulama çatısına güzel ve örneklerle dolu bir giriş niteliği taşıyan yazısının devamını buradan okuyabilirsiniz.

Diyelim Ki Elimizde Nesneye Yönelimli Bir Dil Yok - Alice Nesneler Diyarında

FZ

Elinizdeki programlama dilinde nesneye yönelimli (OO - Object Oriented) programlama imkanı olmasa idi ne yapardınız? İki seçenekten biri gelirdi aklınıza herhalde:
  1. OO desteği veren bir dil kullanmaya başlamak.
  2. Elinizdeki dile OO desteği katmak için uğraşmak.
Bu kısa yazıda Peter Norvig'in PAIP (Paradigms of Artificial Intelligence Programming Case Studies in Common Lisp) kitabının 13. bölümündeki birkaç kısa örnekten yola çıkarak "eğer Common Lisp dilinde CLOS (Common Lisp Object System) gibi bir şey olmasaydı bunu nasıl gerçekleştirebilirdik?" sorusunun cevabının ilk bölümüne göz atacağız.