>>>>> "VST" == Vehbi Sinan Tunalioglu <[EMAIL PROTECTED]> writes:
>>>>> "ES" == Emre Sevinc <[EMAIL PROTECTED]> writes: ES> VST bana "social network analysis" baglaminda basladigi ES> programdan ve Common Lisp ile mailman arsivlerini analiz ES> etmekten bahsediyordu, son konustugumuzda string'leri ES> birlestirmek icin vector-push-extend yerine baska bir sey ES> kullanilmasinin daha performansli olabilecegine dair bir ES> seyler düsünmüstük. Son durum merak ettim (neden bu kadar ES> merakliyim ben? :)) VST> Hemen aciklayayim. VST> Amac : Pipermail ile text formatinda arsivlenmis eposta VST> listelerinin islenebilir hale getirilmesini saglamak. VST> Ornek : http://cs.bilgi.edu.tr/pipermail/cs-lisp/ adresindeki VST> tum arsivlenmis mailleri bir assoc. list ya da sinif VST> kullanarak teker teker bir listeye atmak ve bunlari thread VST> haline sokmak. VST> Kullanilan Araclar: Verilerin internetten alinmasini saglamak VST> icin thttp (trivial-http) ve stringler uzerinde regex ile VST> filtreleme yapmak icin cl-ppcre (regular exp. kutuphanesi) VST> Sorun: Cok yavas calisiyor. [..] VST> Asagida kirli kodu gonderiyorum. Optimizasyon ile ilgili BM bir seyler söylemis, ben de yazim tarzi ile ilgili dikkatimi ceken bazi seyler söylemek istedim. Gördügüm kadari ile Java ve Scheme etkisi hissediliyor kodda: Misal: (defun is-from-line? (line) (ppcre:scan "^From [^ ]+ at [^ ]+" line)) Yani hem basinda "is" var, hem sonunda "?" var. Bildigim kadari ile CL kültüründe bir seyi test ediyorsak o bir "predicate" fonksiyondur, misal evenp, oddp, typep, ... Ya da yapmak istedigimiz test alfa mi degil mi gibi bir test ise alfa-p gibi. Yukaridaki görüntü de cok kötü bir görüntü degil ama hem "is" hem de "?" olunca pek "idiomatic" degil gibi ve de fazladan bir seyler yaziyormusuz gibi. En alttaki fonksiyonu SLIME ile biraz daha alisik oldugum ve kolay okunabilir sekilde formatladim: (defun one-shot-mail-extractor (url-list) (let ((maillist nil) (mail nil)) (loop for rfile in url-list do (let ((content-stream (caddr (thttp:http-get rfile)))) (do ((line (read-line content-stream nil nil) (read-line content-stream nil nil))) ((null line) maillist) (cond ((is-from-line? line) (progn (setf maillist (cons mail maillist)) (setf mail nil) (setf mail (cons (cons ':FROM line) mail)))) ((is-date-line? line) (setf mail (cons (cons ':DATE line) mail))) ((is-subject-line? line) (setf mail (cons (cons ':SUBJECT line) mail))) ((is-msgid-line? line) (setf mail (cons (cons ':MESSAGE-ID line) mail))) ((is-reply-to-line? line) (setf mail (cons (cons ':REPLY-TO-ID line) mail))))))) maillist)) BM'nin dedigi gibi satir satir okumak isi yavaslatiyor olabilir diye düsünüyorum. Önerilen "arsiv dosyasini al oradan kullan" fikrine ek olarak yani oradan yapilsa bile satir satir yapmak yerine önce tüm dosya icerigi okunsa hafizaya, bir degiskene, sonra onun üzerinden is yapilsa daha hizli olmaz mi? Hazir bir de böyle enteresan bir proje baslamisken, mesela DARCS deposu acilsa (bir nevi CVS, olmadi CVS deposu acilsin Bilgi'de) sonracima Emacslarimizla o CVS'e baglansak, kodun son halini ceksek, kurcalasak, yollasak, vs. Bir de SLIME ortaminda profiling nasil yapilir bir baksak (tembelim ben, birileri anlatsa da dinlesem diyorum ;-) Sonra ortaya yavas yavas CL-SNA projesi ciksa, cümle alem "vay canina ne acayip social network analysis araci gelistirmissiniz be birader!" dese... (Emre hayallere dalar...) -- Emre Sevinc eMBA Software Developer Actively engaged in: http:www.bilgi.edu.tr http://ileriseviye.org http://www.bilgi.edu.tr http://fazlamesai.net Cognitive Science Student http://cazci.com http://www.cogsci.boun.edu.tr _______________________________________________ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp