【问题标题】:Variable in closure [closed]闭包中的变量[关闭]
【发布时间】:2012-11-21 16:20:49
【问题描述】:
>
(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?

【问题讨论】:

    标签: lambda lisp closures clisp


    【解决方案1】:

    hib1和hib2的闭包是不同的,即有单独的 变量绑定。

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

    所以对 hib1 环境的任何调用次数都不能改变 hib2 的环境。

    【讨论】:

    • 但是为什么 (funcall (car hib1)) 会改变 (cdr hib1) 中的 f1 和 f2?
    • 当您调用 (hib 1 1) 时,LISP 实现会为该 hib 生成一个环境,并且变量 f1 和 f2 保留在那里。当 hib 改变 f1 和 f2 的值时,它会改变 环境中 f1 和 f2 的值。所以(funcall (car hib1))改变自己环境的f1和f2的值,不能改变其他环境的f1和f2的值。
    猜你喜欢
    • 2014-08-27
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多