better code order
svn: r13168
This commit is contained in:
parent
9e305c79e3
commit
c5f8c43dbf
|
@ -59,10 +59,24 @@
|
||||||
;; X = (force (lazy X)) = (force (lazy (lazy X))) = (force (lazy^n X))
|
;; X = (force (lazy X)) = (force (lazy (lazy X))) = (force (lazy^n X))
|
||||||
(define-syntax (lazy stx)
|
(define-syntax (lazy stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[(lazy expr) (with-syntax ([proc (syntax-property
|
[(lazy expr)
|
||||||
(syntax/loc stx (lambda () expr))
|
(with-syntax ([proc (syntax-property (syntax/loc stx (lambda () expr))
|
||||||
'inferred-name (syntax-local-name))])
|
'inferred-name (syntax-local-name))])
|
||||||
(syntax/loc stx (make-promise proc)))]))
|
(syntax/loc stx (make-promise proc)))]))
|
||||||
|
|
||||||
|
;; Creates a promise that does not compose
|
||||||
|
;; X = (force (delay X)) = (force (lazy (delay X)))
|
||||||
|
;; = (force (lazy^n (delay X)))
|
||||||
|
;; X = (force (force (delay (delay X)))) != (force (delay (delay X)))
|
||||||
|
;; so each sequence of `(lazy^n o delay)^m' requires m `force's and a
|
||||||
|
;; sequence of `(lazy^n o delay)^m o lazy^k' requires m+1 `force's (for k>0)
|
||||||
|
;; (This is not needed with a lazy language (see the above URL for details),
|
||||||
|
;; but provided for regular delay/force uses.)
|
||||||
|
(define-syntax (delay stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(delay expr)
|
||||||
|
(syntax/loc stx
|
||||||
|
(lazy (make-promise (call-with-values (lambda () expr) list))))]))
|
||||||
|
|
||||||
;; For simplicity and efficiency this code uses thunks in promise values for
|
;; For simplicity and efficiency this code uses thunks in promise values for
|
||||||
;; exceptions: this way, we don't need to tag exception values in some special
|
;; exceptions: this way, we don't need to tag exception values in some special
|
||||||
|
@ -80,20 +94,6 @@
|
||||||
(error 'force "reentrant promise ~v" name)
|
(error 'force "reentrant promise ~v" name)
|
||||||
(error 'force "reentrant promise")))))
|
(error 'force "reentrant promise")))))
|
||||||
|
|
||||||
;; Creates a promise that does not compose
|
|
||||||
;; X = (force (delay X)) = (force (lazy (delay X)))
|
|
||||||
;; = (force (lazy^n (delay X)))
|
|
||||||
;; X = (force (force (delay (delay X)))) != (force (delay (delay X)))
|
|
||||||
;; so each sequence of `(lazy^n o delay)^m' requires m `force's and a
|
|
||||||
;; sequence of `(lazy^n o delay)^m o lazy^k' requires m+1 `force's (for k>0)
|
|
||||||
;; (This is not needed with a lazy language (see the above URL for details),
|
|
||||||
;; but provided for regular delay/force uses.)
|
|
||||||
(define-syntax (delay stx)
|
|
||||||
(syntax-case stx ()
|
|
||||||
[(delay expr)
|
|
||||||
(syntax/loc stx
|
|
||||||
(lazy (make-promise (call-with-values (lambda () expr) list))))]))
|
|
||||||
|
|
||||||
;; force iterates on lazy promises (forbids dependency cycles)
|
;; force iterates on lazy promises (forbids dependency cycles)
|
||||||
;; * (force X) = X for non promises
|
;; * (force X) = X for non promises
|
||||||
;; * does not deal with multiple values, except for `delay' promises at the
|
;; * does not deal with multiple values, except for `delay' promises at the
|
||||||
|
|
Loading…
Reference in New Issue
Block a user