39 lines
1.1 KiB
Scheme
39 lines
1.1 KiB
Scheme
; SRFI 45
|
|
; Zhu Chongkai mrmathematica@yahoo.com
|
|
; 25-May-2005
|
|
(module lazy mzscheme
|
|
|
|
(provide lazy
|
|
eager
|
|
s:delay
|
|
s:force
|
|
srfi-45-promise?)
|
|
|
|
(define-struct srfi-45-promise (content))
|
|
|
|
(define-syntax lazy
|
|
(syntax-rules ()
|
|
((_ exp)
|
|
(make-srfi-45-promise (cons #f (lambda () exp))))))
|
|
|
|
(define (eager x)
|
|
(make-srfi-45-promise (cons #t x)))
|
|
|
|
(define-syntax s:delay
|
|
(syntax-rules ()
|
|
((_ exp) (lazy (eager exp)))))
|
|
|
|
(define (s:force promise)
|
|
(if (srfi-45-promise? promise)
|
|
(let ((content (srfi-45-promise-content promise)))
|
|
(if (car content)
|
|
(cdr content)
|
|
(let* ((promise* ((cdr content)))
|
|
(content (srfi-45-promise-content promise)))
|
|
(unless (car content)
|
|
(set-car! content (car (srfi-45-promise-content promise*)))
|
|
(set-cdr! content (cdr (srfi-45-promise-content promise*)))
|
|
(set-srfi-45-promise-content! promise* content))
|
|
(s:force promise))))
|
|
(raise-type-error 'force "srfi-45-promise" promise))))
|