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)
f1
和f2
?變量關閉
爲什麼(funcall (car hib1))
不會改變(cdr hib2)
f1
和f2
?
但爲什麼(funcall(汽車hib1))會改變(CDR hib1)f1和f2? –
當你調用(HIB 11),LISP實現產生environement爲HIB和變量f1和f2保存在那裏。當hib改變f1和f2的值時,它將改變環境中f1和f2的值。所以'(funcall(汽車hib1))'改變它自己的環境的F1和F2的值,並且不能更改的F1值等環境的F2。 –