~ chicken-core (chicken-5) 9079b9b7ab57f296c9e3bf9f9cd42b1bad1a6baf
commit 9079b9b7ab57f296c9e3bf9f9cd42b1bad1a6baf
Author: Moritz Heidkamp <moritz@twoticketsplease.de>
AuthorDate: Mon Nov 5 16:14:36 2012 +0100
Commit: Peter Bex <peter.bex@xs4all.nl>
CommitDate: Mon Nov 5 19:50:48 2012 +0100
Make promises slightly more efficient and less memory intensive
Instead of keeping the promise result in the promise thunk's closure
the implementation is changed to keep the result in a slot of the
promise structure. This allows for removing the reference to the thunk
once the promise has been forced and thus saving some memory.
Signed-off-by: Peter Bex <peter.bex@xs4all.nl>
diff --git a/library.scm b/library.scm
index 438004a1..1711b84a 100644
--- a/library.scm
+++ b/library.scm
@@ -341,8 +341,15 @@ EOF
(define (##sys#force promise)
(if (##sys#structure? promise 'promise)
- ((##sys#slot promise 1))
- promise) )
+ (apply ##sys#values
+ (or (##sys#slot promise 2)
+ (let ((results (##sys#call-with-values (##sys#slot promise 1) (lambda xs xs))))
+ (or (##sys#slot promise 2)
+ (begin
+ (##sys#setslot promise 1 #f)
+ (##sys#setslot promise 2 results)
+ results)))))
+ promise))
(define force ##sys#force)
@@ -4708,22 +4715,7 @@ EOF
;;; Promises:
(define (##sys#make-promise proc)
- (let ([result-ready #f]
- [results #f] )
- (##sys#make-structure
- 'promise
- (lambda ()
- (if result-ready
- (apply ##sys#values results)
- (##sys#call-with-values
- proc
- (lambda xs
- (if result-ready
- (apply ##sys#values results)
- (begin
- (set! result-ready #t)
- (set! results xs)
- (apply ##sys#values results) ) ) ) ) ) ) ) ) )
+ (##sys#make-structure 'promise proc #f))
(define (promise? x)
(##sys#structure? x 'promise) )
Trap