闭包变量 > (除雾hib(f1和f2) (缺点 (功能 (lambda() (setq f2(+f1(setq f1 f2))) ) (功能 (lambda() (列表88 f1 F299)) ) ) ) hib >(setq hib1(hib1)) (# . #) >(setq hib2(hib 1) (# . #) >(funcall(汽车hib1)) 2. >(funcall(汽车hib1)) 3. >(funcall(cdr hib1)) (88 2 3 99) >(funcall(汽车hib1)) 5. >(funcall(cdr hib1)) (88 3 5 99) >(funcall(汽车hib1)) 8. >(funcall(cdr hib1)) (88 5 8 99) >(funcall(汽车hib2)) 2. >(funcall(cdr hib2)) (88 1 2 99) >(funcall(cdr hib1)) (88 5 8 99) >(funcall(汽车hib2)) 3. >(funcall(cdr hib2)) (88 2 3 99)
为什么闭包变量 > (除雾hib(f1和f2) (缺点 (功能 (lambda() (setq f2(+f1(setq f1 f2))) ) (功能 (lambda() (列表88 f1 F299)) ) ) ) hib >(setq hib1(hib1)) (# . #) >(setq hib2(hib 1) (# . #) >(funcall(汽车hib1)) 2. >(funcall(汽车hib1)) 3. >(funcall(cdr hib1)) (88 2 3 99) >(funcall(汽车hib1)) 5. >(funcall(cdr hib1)) (88 3 5 99) >(funcall(汽车hib1)) 8. >(funcall(cdr hib1)) (88 5 8 99) >(funcall(汽车hib2)) 2. >(funcall(cdr hib2)) (88 1 2 99) >(funcall(cdr hib1)) (88 5 8 99) >(funcall(汽车hib2)) 3. >(funcall(cdr hib2)) (88 2 3 99),lambda,lisp,closures,clisp,Lambda,Lisp,Closures,Clisp,为什么(funcall(car hib1))会在(cdr hib1)中更改f1和f2 为什么(funcall(car hib1))在(cdr hib2)中不会改变f1和f2?hib1和hib2的闭包是不同的,即有单独的 变量绑定 调用(funcall(car hib1))更改hib1周围f1和f2的值。 这些值与hib2周围的f1和f2完全不同 因此,对hib1环境的任何数量的调用都不能改变hib2的环境。hib1和hib2的闭包是不同的,即有单独的 变量绑定 调用(funcall(car hi
(funcall(car hib1))
会在(cdr hib1)
中更改f1
和f2
为什么
(funcall(car hib1))
在(cdr hib2)
中不会改变f1
和f2
?hib1和hib2的闭包是不同的,即有单独的
变量绑定
调用(funcall(car hib1))
更改hib1周围f1和f2的值。
这些值与hib2周围的f1和f2完全不同
因此,对hib1环境的任何数量的调用都不能改变hib2的环境。hib1和hib2的闭包是不同的,即有单独的 变量绑定 调用
(funcall(car hib1))
更改hib1周围f1和f2的值。
这些值与hib2周围的f1和f2完全不同
因此,对hib1环境的任何数量的调用都不能改变hib2的环境。但是为什么(funcall(car hib1))会改变(cdr hib1)中的f1和f2?当调用(hib1 1)时,LISP实现为该hib生成一个环境,变量f1和f2保留在那里。当hib更改f1和f2的值时,它会更改环境中f1和f2的值。所以(funcall(car hib1))
更改它自己环境的f1和f2值,而不能更改其他环境的f1和f2值。但是为什么(funcall(car hib1))会在(cdr hib1)中更改f1和f2呢?当调用(hib1 1)时,LISP实现会为该hib生成一个环境,变量f1和f2保存在那里。当hib更改f1和f2的值时,它会更改环境中f1和f2的值。因此(funcall(car hib1))
更改其自身环境的f1和f2值,而不能更改其他环境的f1和f2值。
>
(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)