>>>>> "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