2012-12-04 155 views
0
> 
(defun hib (f1 f2) 
    (cons 
    (function 
     (lambda() 
     (setq f2 (+ f1 (setq f1 f2)))) 
    ) 
    (function 
     (lambda() 
     (list 88 f1 f2 99)) 
    ) 
) 
) 
hib 
> (setq hib1 (hib 1 1)) 
(#<function :lambda nil (setq f2 (+ f1 (setq f1 f2)))> . 
#<function :lambda nil (list 88 f1 f2 99)>) 
> (setq hib2 (hib 1 1)) 
(#<function :lambda nil (setq f2 (+ f1 (setq f1 f2)))> . 
#<function :lambda nil (list 88 f1 f2 99)>) 
> (funcall (car hib1)) 
2 
> (funcall (car hib1)) 
3 
> (funcall (cdr hib1)) 
(88 2 3 99) 
> (funcall (car hib1)) 
5 
> (funcall (cdr hib1)) 
(88 3 5 99) 
> (funcall (car hib1)) 
8 
> (funcall (cdr hib1)) 
(88 5 8 99) 
> (funcall (car hib2)) 
2 
> (funcall (cdr hib2)) 
(88 1 2 99) 
> (funcall (cdr hib1)) 
(88 5 8 99) 
> (funcall (car hib2)) 
3 
> (funcall (cdr hib2)) 
(88 2 3 99) 

爲什麼(funcall (car hib1))將改變(cdr hib1)f1f2變量關閉

爲什麼(funcall (car hib1))不會改變(cdr hib2)f1f2

回答

3

hib1和hib2的封閉件是不同的,即,有單獨 變量綁定。

調用(funcall (car hib1))改變圍繞該hib1 f1和f2的值。 這些值與hib2周圍的f1和f2完全不同。

因此,任何數量的呼叫hib1的環境無法改變hib2的環境。

+0

但爲什麼(funcall(汽車hib1))會改變(CDR hib1)f1和f2? –

+1

當你調用(HIB 11),LISP實現產生environement爲HIB和變量f1和f2保存在那裏。當hib改變f1和f2的值時,它將改變環境中f1和f2的值。所以'(funcall(汽車hib1))'改變它自己的環境的F1和F2的值,並且不能更改的F1值等環境的F2。 –