Closed. This question needs details or clarity. It is not currently accepting answers. Learn more。
想改进这个问题吗添加细节并通过editing this post澄清问题。
5年前关闭。
为什么
为什么
想改进这个问题吗添加细节并通过editing this post澄清问题。
5年前关闭。
>
(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))
会在f1
中改变f2
和(cdr hib1)
?为什么
(funcall (car hib1))
在f1
中不会改变f2
和(cdr hib2)
? 最佳答案
hib1和hib2的闭包是不同的,即有单独的
变量绑定。
调用(funcall (car hib1))
将更改hib1周围f1和f2的值。
这些值与hib2周围的f1和f2完全不同。
所以对hib1环境的任何调用都不能改变hib2的环境。
09-06 23:34