Changeset 14160 in project


Ignore:
Timestamp:
04/07/09 20:03:51 (11 years ago)
Author:
Kon Lovett
Message:

Save.

Location:
release/4/srfi-45
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • release/4/srfi-45/tags/2.1.0/srfi-45.scm

    r14158 r14160  
    109109                (let* ((value* (receive (value)))
    110110                       ; Re-fetch and check the top promise again in case it recursed into `force'
    111                        (prmbox (%promise-box prm)) )
     111                       (prmbox (and (%recursive-promise? prm) (%promise-box prm))) )
    112112                  ; Copy the promise to the top
    113                   (unless (%eager-promise-box? prmbox)
    114                     (let* ((prm* (and (= 1 (length value*)) (%car value*)))
    115                            (prmbox* (if (and prm* (%recursive-promise? prm*))
    116                                         ; then we got our promise
    117                                         (%promise-box prm*)
    118                                         ; else this shouldn't happen
    119                                         (error 'force "expected a recursive promise" value*) ) ) )
    120                       (%promise-box-tag-set! prmbox (%promise-box-tag prmbox*))
    121                       (%promise-box-value-set! prmbox (%promise-box-value prmbox*))
    122                       (%promise-box-set! prm* prmbox) ) )
    123                    ; Now that all the work has been done, return a result
    124                    (force prm) )
     113                  (cond
     114                    ((or (not prmbox) (%eager-promise-box? prmbox))
     115                      (force prm) )
     116                    (else
     117                      (let* ((prm* (and (= 1 (length value*)) (%car value*)))
     118                             (prmbox* (and (%recursive-promise? prm*) (%promise-box prm*))) )
     119                        (cond
     120                          (prmbox*
     121                            (%promise-box-tag-set! prmbox (%promise-box-tag prmbox*))
     122                            (%promise-box-value-set! prmbox (%promise-box-value prmbox*))
     123                            (%promise-box-set! prm* prmbox)
     124                            (force prm) )
     125                          (else
     126                            (apply values value*)
     127                            #;(error 'force "expected a recursive promise" value*) ) ) ) ) ) )
    125128                ; else this shouldn't happen
    126129                (error 'force "expected an un-forced lazy promise" value) ) )
  • release/4/srfi-45/trunk/srfi-45.scm

    r14158 r14160  
    109109                (let* ((value* (receive (value)))
    110110                       ; Re-fetch and check the top promise again in case it recursed into `force'
    111                        (prmbox (%promise-box prm)) )
     111                       (prmbox (and (%recursive-promise? prm) (%promise-box prm))) )
    112112                  ; Copy the promise to the top
    113                   (unless (%eager-promise-box? prmbox)
    114                     (let* ((prm* (and (= 1 (length value*)) (%car value*)))
    115                            (prmbox* (if (and prm* (%recursive-promise? prm*))
    116                                         ; then we got our promise
    117                                         (%promise-box prm*)
    118                                         ; else this shouldn't happen
    119                                         (error 'force "expected a recursive promise" value*) ) ) )
    120                       (%promise-box-tag-set! prmbox (%promise-box-tag prmbox*))
    121                       (%promise-box-value-set! prmbox (%promise-box-value prmbox*))
    122                       (%promise-box-set! prm* prmbox) ) )
    123                    ; Now that all the work has been done, return a result
    124                    (force prm) )
     113                  (cond
     114                    ((or (not prmbox) (%eager-promise-box? prmbox))
     115                      (force prm) )
     116                    (else
     117                      (let* ((prm* (and (= 1 (length value*)) (%car value*)))
     118                             (prmbox* (and (%recursive-promise? prm*) (%promise-box prm*))) )
     119                        (cond
     120                          (prmbox*
     121                            (%promise-box-tag-set! prmbox (%promise-box-tag prmbox*))
     122                            (%promise-box-value-set! prmbox (%promise-box-value prmbox*))
     123                            (%promise-box-set! prm* prmbox)
     124                            (force prm) )
     125                          (else
     126                            (apply values value*)
     127                            #;(error 'force "expected a recursive promise" value*) ) ) ) ) ) )
    125128                ; else this shouldn't happen
    126129                (error 'force "expected an un-forced lazy promise" value) ) )
Note: See TracChangeset for help on using the changeset viewer.