(define-module (gacela utils)
#:export (use-cache-with
arguments-calling
- arguments-apply))
+ arguments-apply
+ bound?))
;;; Cache for procedures
(define (required-arguments args values)
"Return an alist with required arguments and their values"
(define (f vars values)
- (cond ((or (null? vars) (null? values)) '())
+ (cond ((null? vars) '())
+ ((null? values) (assoc-set! (f (cdr vars) '())
+ (car vars)
+ undefined))
(else (assoc-set! (f (cdr vars) (cdr values))
(car vars)
(car values)))))
(optional-arguments-apply args values)
(keyword-arguments-apply args values)
(rest-arguments-apply args values))))
+
+
+;;; Continuations and coroutines
+
+(define (make-producer body)
+ (define resume #f)
+ (lambda (real-send)
+ (define send-to real-send)
+ (define (send value-to-send)
+ (set! send-to
+ (call/cc
+ (lambda (k)
+ (set! resume k)
+ (send-to value-to-send)))))
+ (if resume
+ (resume real-send)
+ (body send))))