Re: Reentrancy-detecting, faster implementation
Eli Barzilay 20 Oct 2006 06:14 UTC
On Oct 19, Andre van Tonder wrote:
> Here is another safe-for-space version of srfi-45 promises that
> detects reentrant promises and should be faster.
> [...]
> (define (dispatch node)
> (let ((type (car node))
> (content (cdr node)))
> (set-car! node 'shared) ; maintain any sharing by
> (set-cdr! node root-node) ; pointing back to root
> (case type
> ((lazy) (dispatch (content)))
> ((value) (set-car! root-node 'value) ; overwrite root at end
> (set-cdr! root-node content)
> content)
> ((shared) (dispatch content))
> (else (error "Invalid promise")))))
One problem in the above: it should also catch a hole and throw a
reentrant error, otherwise:
(letrec ([a (lazy a)]) (force a))
produces a bad error message. (I will post a version that fixes this,
(and adds more) soon.)
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!