闭包变量 > (除雾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)