Eveet, kendi emailime cevap veriyorum: kimseyi osuna
yormamis olayim ;-). Asagidaki cevap Frode Vatvedt
Fjeld adli zata ait. Bu dinamik binding olayini
ogrenmek birsey degildi de, alismak zaman alacak biraz
benim icin ;-). Bir yerde "Fortran (veya C)
bilmeyenler Lisp'i birkac gunde, bilenler ancak birkac
ilda ogrenir ) diye bir laf gormustum, dogru mu acaba
diye pirelenmeye basladim ;-). Neyse iste fark:
(defun f (x)
(print x)
(let ((*print-base* 16))
(f y)))
ile
(defun tco-f (x)
(tagbody restart-f
(print x)
(let ((*print-base* 16))
(setf x y) (go restart-f))))
yapilarini karsilastirirsaniz, tail recursion
optimizasyonu olmadan birincinin x'i daima
*print-base* daha once neyse oyle yazacagini,
ikincinin (ki birincinin TCO uygulanmis haline
esdeger) ilk defa orijinal fonksiyon gibi, ardindan
ise 16 tabaninda yazacagini goreceksiniz (denemedim,
ama oyle olmasi lazim).
KISSADAN HISSE: Ozyineli fonksiyonlari optimize
etmeden iki kere dusunun! Eger fonksiyonun icinde
dinamik bagladiginiz bir degisken varsa ve bir sekilde
onun degerini degistiriyorsaniz, programinizda sorun
var demektir! Ya sadece lexical binding ile
bagladiginiz degiskenleri kullanin, veya illa ki
dinamik degiskenleri kullanancaksaniz fonksiyonun
icinde bunun degerini degistirip de tail recursion
yapmayin.
NOT: Ben daha lispi yeni ogreniyorum, benim
yazdiklarimi kontrol etmeden dogru gibi algilamayin.
Sadece anladigimi ve ogrendigimi dusundugum (ve
okudugum kitapta da henuz acikca bulamadigim) bir
noktayi sizlerle paylasmak istedim.
Nusret
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp