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.

Paul Graham’ın Startup Destek Şirketi İlk Meyvelerini Veriyor

FZ

Paul Graham'ın startup şirketlere destek olma amacı ile kurduğu Y Combinator* ilk meyvelerini vermeye başladı.

Y Combinator'dan aldıkları destekle bir şirket kuran iki genç üniversite mezunu http://reddit.com sistemini devreye soktular.

Hedeflerinde kısaca şunu diyorlar: "Her Internet kullanıcısının ana sayfası olmak istiyoruz." İnsanda Google çağrışımı yapan bir cümle, öte yandan sitenin sadeliği ve işlevselliği de Google'ı hatırlatmıyor değil. Fikir çok özgün değil, yeni Internet siteleri, haberler, yazılar, kısaca URLsi verilebilecek herhangi bir şey. Gönderdiğiniz haberin popülaritesi diğer üyeler tarafından belirleniyor. Buna göre sizin popülariteniz, vs. de belirleniyor. Kullanılan "karma" sözcüğü de doğrudan Slashdot'u çağrıştırmakla birlikte /. editör kaprislerinden ve yorum kirliliğinden uzakta, yepyeni bir kavramı hayatımıza katabilir.

'Lisp Outside the Box' Düştü Mü?

okanakyuz

Nick Levine tarafından O'Reilly için 2009 yılında yazılması planlanmaya başlanan ve resmi sitesi lisp-book.org şeklinde olan hayal kitap tarih oldu gibi duruyor. Kitap her lisp meraklısı gibi benim de hayallerimi süslemekte, (Özellikle kısım 3 ve kısım 6) fakat görünen o ki bu proje tarih olmuş durumda. Bir arkadaşım ile sohbet ederken öğrendiğim bilgi bu kitaba asla kavuşamayacağımız yönündeki dedikodu. Kitap için tek satır bile yazılmamakta artık. Dilerim birisi çıkar ve yeni bir proje başlatır. Çünkü Hacker lugatında O'Reilly'den bir kitap çıkartmak dünyadaki en önemli 2 hadiseden biri (diğeri zengin olmak ve paraya para dememek)

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.

Pascal Costanza'nın Çok Dik Başlı Lisp Rehberi

FZ

Uzunca uğraşlardan sonra Pascal Costanza'nın dik başlı (!) Lisp kılavuzunu Bilkent Bilg. Müh. bölümü öğrencilerinden Hayrettin Gürkök'ün çevirisi ile anadilimizde yayımlama imkanına kavuştuk. AOP yani Aspect Oriented Programlama mefhumunu Common Lisp'e kazandırmış olan (ya da Debiancılar için: Debian aspectl paketleri) Costanza'nın bu yazısının Lisp heveslilerinin işine yarayacağını ümit ediyoruz.

Çevirinin özgün adresi http://ileriseviye.org/arasayfa.php?inode=costanza-lisp-guide.html'dir. Emeği geçen herkesin eline sağlık. Afiyet olsun...