mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-15 08:47:35 +02:00
Initial file
This commit is contained in:
parent
b46c5ae8eb
commit
3fc61521fb
1 changed files with 46 additions and 0 deletions
46
scheme/lazy.sld
Normal file
46
scheme/lazy.sld
Normal file
|
@ -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))))))
|
Loading…
Add table
Reference in a new issue