From 3fc61521fbf5f45097764e8a9f49935e29cfae49 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Fri, 5 Feb 2016 21:14:39 -0500 Subject: [PATCH] Initial file --- scheme/lazy.sld | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 scheme/lazy.sld diff --git a/scheme/lazy.sld b/scheme/lazy.sld new file mode 100644 index 00000000..24286f5a --- /dev/null +++ b/scheme/lazy.sld @@ -0,0 +1,46 @@ +(define-library (scheme lazy) + (import (scheme base)) + (export + delay + force + delay-force + make-promise + promise?) + (begin + (define (make-promise x) + (delay x)) + ;) + ;(begin + (define (promise? x) + (and (pair? x) + (null? (cdr x)) + (pair? (car x)) + (or (eq? #t (caar x)) + (and (eq? #f (caar x)) + (procedure? (cdar x)))))) + + (define-syntax delay-force + (er-macro-transformer + (lambda (expr rename compare) + `(,(rename 'promise) #f (,(rename 'lambda) () ,(cadr expr)))))) + + (define-syntax delay + (er-macro-transformer + (lambda (expr rename compare) + `(,(rename 'delay-force) (,(rename 'promise) #t ,(cadr expr)))))) + + (define (promise done? proc) + (list (cons done? proc))) + (define (promise-done? x) (car (car x))) + (define (promise-value x) (cdr (car x))) + (define (promise-update! new old) + (set-car! (car old) (promise-done? new)) + (set-cdr! (car old) (promise-value new)) + (set-car! new (car old))) + (define (force promise) + (if (promise-done? promise) + (promise-value promise) + (let ((promise* ((promise-value promise)))) + (if (not (promise-done? promise)) + (promise-update! promise* promise)) + (force promise))))))