20101124

Dynamic Scoping in Lisp

Iki hafta once siparis verdigim kitap dun elime gecti: Let Over Lambda, Doug HOYTE.
Bekledigimden cok daha guzel bir kitap cikti. Ilk okudugum bolumunden dikkatimi ceken seyleri yazmak istedim.

Bolum closure'lar uzerine.. Ben closure'lari JavaScriptten hatirladigim icin ilk olarak ordaki gibi dusundum ama asagidaki ornek JS de implicit olarak yapilmiyor. JSdeki closure'la Lisp'i karistirmamak lazimmis (zaten tam closure degil dynamic scoping) . Lisp'in bunu bu sekilde yapmasi nedense hosuma gitti...

;;LISP KODU;;
(defvar *temp-special* 1)

(defun temp-special-returner()  
  *temp-special*)
(temp-special-returner) ;;;donen deger: 1


;; let ile normalde lexical variable yaratiyoruz
;; ama asagida durum farkli...
(let ((*temp-special* 2)) 
  (temp-special-returner));;donen deger: 2 ****

(temp-special-returner);;donen deger: 1 *****


Bunu JSde yaziyim dedim bir de; bakalim sonuc ne olacak diye.

special = 1;

function specialReturner() {
  return special;
}

alert(specialReturner());//donen deger: 1

alert(
(function(special) {
  return function() {
    return specialReturner();
  })(2)()
);//donen deger: 1

alert(specialReturner());//donen deger: 1