(defun f()
(let ((i 0))
(lambda()
(prog1
i
(format t "lazy call ~A~%" i)
(incf i)))))
(let ((i 0))
(defun g()
(lambda()
(prog1
i
(format t "lazy call ~A~%" i)
(incf i)))))
(let ((a (f))
(b (f)))
(dotimes (i 10)
(format t "~A ~A ~A~%" (funcall a) (funcall b) (funcall b))))
(let ((a (g))
(b (g)))
(dotimes (i 10)
(format t "~A ~A ~A~%" (funcall a) (funcall b) (funcall b))))
fを呼び出すと、呼び出すたびにlet iが実行されて新しいiが生成されるってことなんだろうな
そんでfの中のlambdaは都度生成されたiを参照するようになるということなんだろうな
多分そんな理解でいいんじゃないかなと思います
あと、common lispでできるか不明だけどマルチスレッドの場合prog1で囲った部分を排他できるとなお吉ではないかなと思います