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 Uygulama Sunucusu Kurulumu

anonim

Common Lisp tabanlı uygulama sunucumuzu ücretsiz olarak deneyebilirsiniz. Bunun için yapmanız gerekenlerin anlatıldığı belgeye göz atabilirsiniz.

Günümüzde üretilen yazılımların çoğu web uygulamaları şeklinde ya da web servisleri olarak hizmet vermektedir. Web uygulamaları, erişilebilir, birden fazla kişinin kullanımına elverişli ve merkezi olarak güncellenebilir servislerdir.

Gelecekte oldukça fazla web uygulaması ve web servisi yazacağımız düşünüldüğünde bu konuda bize yardımcı olacak araçlar üretmek iyi bir yatırım olacaktır. Bu nedenle yazımda sizlere Common Lisp dili ile yazılmış bir web uygulama sunucusu olan Kor Web Uygulama Sunucusu'nu tanıtacağım.

International Lisp Conference (ILC) 2007 izlenimleri

coskung

İstanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü'nden Vehbi Sinan Tunalıoğlu ile birlikte, ilc 2007'ye katıldık. Katıldığımız konuşmalardan izlenimleri, yaptığımız fikir alışverişlerini kısaca özetleyeyim.

LISP, Debian Sarge'da en çok kullanılan 4. dil

acemi_

Araştırmanın detayları (pdf)

Debian Sarge'ın boyutunu ve değerini inceleyen bir araştırma yapılmış. Bu araştırmada Debian Sarge'da yer alan yazılımların kaynak kodları ile ilgili bir bölüm var. Araştırmayı yapan kişilere ve bana ilginç gelen bir durum söz konusu... Bu dağıtımı hazırlarken en çok kullanılan dördüncü dil: LISP

C++ içinde Lisp kullanmak

bk

C++ kodlarken "ah şu anda filanca fikrimi Lisp ile ne kadar kolay ifade ederdim" dediğiniz oluyor mu? Bir ortamdan diğerine geçmeye, ayrı ayrı işlemler yapmaya üşenenlerden misiniz?

En az bir evet cevabı verdi iseniz InteLib tam size göre. C++ kodlarken doğrudan Lisp sözdizimine ve semantiğine çok benzer şekilde kod yazmanızı ve doğrudan derlemenizi sağlayan bir kütüphane. Şu anda aktif olarak geliştiriliyor. Ne gerek var ki böyle bir şeye diyenler FAQ belgesini okuyabilirler.

Coretal CMS Videoları

eevrim

Core Server üzerine geliştirdiğimiz ilk uygulama olan Coretal İçerik Yönetim Sisteminin kullanım ve tasarım videolarını hazırladık. Fikirlerinizi duymaktan mutluluk duyacağız.

Sevgiler.

Ürün sayfası, Kullanıcı Videosu, Tasarımcı Videosu