>>>>> "VY" == Volkan YAZICI <[EMAIL PROTECTED]> writes:
[...]
    VY> (let ((e 1)) (defun closure-1 () e))

    VY> Ve closure-1 fonksiyonu let scope'unun dışından da
    VY> çağrılabiliyordu. Ama Scheme'de, yapılan tanımlama, var olduğu
    VY> scope'a ait ve mevcudiyeti ancak orada geçerli. (Aslında çok
    VY> şık bir CL özelliği bu.)

Evet.  R5RS 5.2.2'ye bakarsaniz, scheme define'inin CL defun'i gibi 
olmadigi ortaya cikiyor.  Sunu yaparsiniz:

(define test-closure ())
(let ((e 1)) (set! test-closure (lambda () e)))

olur ama istediginiz isi gormez.  Su da olur:

> (define test-closure2 
  (let ((e 2))
    (lambda () (set! e (+ 1 e)) e)))
> (test-closure2)
3
> (test-closure2)
4
> 

ama yine istediginiz isi gormez.  Yanlis hatirlamiyorsam arzu ettiginiz sey 
sizin prosedurunuz calistiktan sonra degistirse bile butun degiskenlerin 
eski degerlerine donmeleriydi.  

CL'de bu problem olmuyor cunku butun global degiskenler dinamik
(special).  Lexical closure'a luzum yok.  Demek istedigim, o let'in
icine defunla konma hali degil CL'in getirdigi esas kolaylik.  Soyle
yani:

CL-USER> (defvar *aman-sakla* 'saklandim-abi)
*AMAN-SAKLA*
CL-USER> (defun birsey-yap (x) (setf *aman-sakla* x))
BIRSEY-YAP
CL-USER> (defun mincikla () 
           (print *aman-sakla*) 
           (birsey-yap 'bozdum-oni)
           (print *aman-sakla*)) 
MINCIKLA
CL-USER> (let ((*aman-sakla* 'saklaniyon-mu))
           (mincikla)
           (print *aman-sakla*))

SAKLANIYON-MU 
BOZDUM-ONI 
BOZDUM-ONI 
BOZDUM-ONI
CL-USER> *aman-sakla*
SAKLANDIM-ABI
CL-USER> 

Farkindaysaniz mincikla fonksyonu o let'le yaratilan bindingi lexical 
olarak goremiyor, dinamik goruyor.

Sizin icin aklima gelen kolay cozum, saklamak istediginiz degerleri 
bir associon list gibi birseye atip isiniz bittikten sonra 'restore' 
etmeniz.  Yalniz iskembeden attigimi soyleyeyim, scheme'e (bu liste 
icin deminki gibi elledigim zamanlar haric) ellemeyeli cok uzun zaman 
oldu.  Daha iyi bilenler ses cikartsin lutfen.  

BM


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

Cevap