racket/collects/srfi/45/lazy.ss
2005-05-27 18:56:37 +00:00

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))))