0
>
(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))変わるf1f2でしょう(cdr hib1)か?

なぜ(funcall (car hib1))変わらないf1f2です(cdr hib2)か?

4

1 に答える 1

3

hib1 と hib2 のクロージャーは異なります。つまり、別の変数バインディングがあります。

呼び出す(funcall (car hib1))と、hib1 を中心に f1 と f2 の値が変化します。これらの値は、hib2 付近の f1 と f2 でまったく異なります。

したがって、hib1 の環境を何回呼び出しても、hib2 の環境を変更することはできません。

于 2012-12-04T05:00:33.677 に答える