Programi anlayip calistirmadim simdi ama sadece yuzeyden okuyarak 
bir iki sey soyleyeyim:

defvar, defparameter, defconstant arasinda yeni baslayanlar icin
gelistirme esnaisinda en tehlikeli olan defvar.  Pes pese evaluate 
edildiginde degeri degistirmiyor.  

CL-USER> (defvar *foo* '(1 2 3))
*FOO*
CL-USER> *foo*
(1 2 3)
CL-USER> (defvar *foo* '(1 2 3 4))
*FOO*
CL-USER> *foo*
(1 2 3)

Tek bacakli if yerine when kullanmak bazen daha okunakli olabilir.  Sizin
programda bir ornek bulamadim ama ozellikle (if (foo-p x) (progn ...)) 
yerine when daha uygun.  Progn gerektirmese bile else'i olmayan uzun
if'ler icin de when bana daha dogru geliyor.  Burada belli bir kural
yok benim bildigim -- programciya kalmis.  Mesela

(defun k1 (dizge)
  (if (gecerli-p dizge)
      (if (equal (last dizge) '(I))
          (append dizge '(U))
        dizge)))

yerine

(defun k1 (dizge)
  (when (gecerli-p dizge)
    (if (equal (last dizge) '(I))
        (append dizge '(U))
        dizge)))

Olabilir.

Seboller icin eq calisiyor, en azindan ben okurken 

(if (equal i 'U) ...

diye birsey gorunce icimden 'bir dakika, ne oluyor burada?' diyorum.  

(if (eq i 'U) ...

gorunce rahat ediyorum.  


Soylenmese de, genelde i j k isimli degiskenlerin tamsayi olmasi 
bekleniyor okurken.  Dolayisiyla su benim gozumu tirmaliyor

(defun gecerli-p (dizge)
  (dolist (i dizge t)
    (if (not (member i *miu* :test #'equal))
        (return nil))))

Soyle de olur bu herhalde: (dikkat denemedim ve cok hata yaparim bunlarda 
ben!)

(defun gecerli-p (dizge)
  (every #'(lambda (x)
             (member x *miu* :test #'equal))
         dizge))

ve *miu* sembollerden ibaret olduguna gore 

(defun gecerli-p (dizge)
  (every #'(lambda (x)
             (member x *miu*)
         dizge))


CL buyuk bir dil, bunun getirileri var, mesela

(setf sayac2 (1+ sayac2))  

yerine

(incf sayac2) 

BM


_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap