mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-08 13:37:33 +02:00
Functional build-out of delay
This commit is contained in:
parent
61976a139e
commit
6e8c0b6088
1 changed files with 42 additions and 2 deletions
|
@ -1,3 +1,43 @@
|
||||||
TODO: support for concurrent delay and promise as implemented by Clojure
|
;; TODO: support for concurrent delay and promise as implemented by Clojure
|
||||||
|
;; See: https://purelyfunctional.tv/guide/clojure-concurrency/
|
||||||
|
|
||||||
See: https://purelyfunctional.tv/guide/clojure-concurrency/
|
(import (scheme write) (scheme base) (cyclone concurrent) (srfi 18))
|
||||||
|
|
||||||
|
(define-record-type <delay>
|
||||||
|
(%make-delay done result lock)
|
||||||
|
delay?
|
||||||
|
(done delay:done delay:set-done!)
|
||||||
|
(value delay:value delay:set-value!) ;; Either thunk or result
|
||||||
|
(lock delay:lock delay:set-lock!))
|
||||||
|
|
||||||
|
(define (make-delay thunk)
|
||||||
|
(%make-delay #f thunk (make-mutex)))
|
||||||
|
|
||||||
|
(define (delay-deref d)
|
||||||
|
(when (not (delay? d))
|
||||||
|
(error "Expected future but received" d))
|
||||||
|
(mutex-lock! (delay:lock d))
|
||||||
|
(cond
|
||||||
|
((delay:done d)
|
||||||
|
(delay:value d))
|
||||||
|
(else
|
||||||
|
(delay:set-value! d
|
||||||
|
(make-shared ((delay:value d)))) ;; Exec thunk and store result
|
||||||
|
(delay:set-done! d #t)))
|
||||||
|
(mutex-unlock! (delay:lock d))
|
||||||
|
)
|
||||||
|
|
||||||
|
(define-syntax shared-delay
|
||||||
|
(er-macro-transformer
|
||||||
|
(lambda (expr rename compare)
|
||||||
|
`(make-delay (lambda () ,(cadr expr))))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (test)
|
||||||
|
(write '(testing)) (newline)
|
||||||
|
'done)
|
||||||
|
|
||||||
|
(define d (shared-delay (test)))
|
||||||
|
(write (delay-deref d))(newline)
|
||||||
|
(write (delay-deref d))(newline)
|
||||||
|
(write (delay-deref d))(newline)
|
||||||
|
|
Loading…
Add table
Reference in a new issue