;;;; Cyclone Scheme ;;;; https://github.com/justinethier/cyclone ;;;; ;;;; Copyright (c) 2014-2016, Justin Ethier ;;;; All rights reserved. ;;;; ;;;; This module contains the lazy library from r7rs. ;;;; (define-library (scheme lazy) (import (scheme base)) (export delay force delay-force make-promise promise? ) (begin (define force (lambda (object) (object))) (define-syntax delay (er-macro-transformer (lambda (expr rename compare) `(make-promise (lambda () ,(cadr expr)))))) (define-syntax delay-force (er-macro-transformer (lambda (expr rename compare) `(make-promise (lambda () ,(cadr expr)))))) (define make-promise (lambda (proc) (let ((result-ready? #f) (result #f)) (lambda () (if result-ready? result (let ((x (proc))) (if result-ready? result (begin (set! result x) (set! result-ready? #t) result)))))))) ;; Not a very satisfying implementation, but would need to change ;; how promises are stored to do better (define promise? procedure?) ))