cyclone/scheme/lazy.sld
2016-02-14 22:35:04 -05:00

51 lines
1.2 KiB
Scheme

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