关闭变量

时间:2012-12-04 04:37:14

标签: lambda lisp closures clisp

>
(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)

1 个答案:

答案 0 :(得分:3)

hib1和hib2的闭包是不同的,也就是说,它们是分开的 变量绑定。

调用(funcall (car hib1))会更改hib1周围的f1和f2的值。 这些值与hib2周围的f1和f2完全不同。

因此,对hib1环境的任何调用都无法改变hib2的环境。