GNU bug report logs -
#26073
How should cl-symbol-macrolet interact with rebindings?
Previous Next
Reported by: Paul Pogonyshev <pogonyshev <at> gmail.com>
Date: Sun, 12 Mar 2017 13:26:01 UTC
Severity: normal
Tags: fixed
Fixed in version 27.1
Done: Noam Postavsky <npostavs <at> gmail.com>
Bug is archived. No further changes may be made.
Full log
Message #26 received at 26073 <at> debbugs.gnu.org (full text, mbox):
> Could you give me some concrete (but simple) example?
Basically, when you define a generator function
(iter-defun foo ()
(let ((x (bar 1)))
(iter-yield x)
(iter-yield (+ x (bar 2)))))
the resulting iterator must somehow preserve value of `x' after
the first yield-point. Therefore, the iterator function will
look something like this (simplified):
(defun foo-iterator ()
(let* (outer-scope-x
to-execute
(step-1 (lambda ()
(setf to-execute step-2)
(setf outer-scope-x (bar 1))
(throw 'yield outer-scope-x)))
(step-2 (lambda ()
(throw 'yield (+ outer-scope-x (bar 2))))))
(setf to-execute step-1)
(build-iterator-object ...)))
Here `outer-scope-x' is the rebinding of `x' needed to somehow
send its value from first step closure to the second.
Iteration
(let ((iter (foo-iterator)))
(iter-next iter)
(iter-next iter))
will then look like (omitting all the internal crap):
(let ((iter (foo-iterator)))
(call-to-execute iter) ; here to-execute = step-1
(call-to-execute iter)) ; here to-execute = step-2
But remember that the caller of `iter-next' knows nothing about
how iterator internally works and has no idea what it really
does and how it achieves the documented behavior (or doesn't,
when there is a bug).
Paul
This bug report was last modified 7 years and 100 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.