Reentrancy-detecting, faster implementation Andre van Tonder (19 Oct 2006 21:50 UTC)
Re: Reentrancy-detecting, faster implementation Eli Barzilay (20 Oct 2006 06:14 UTC)

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!