X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Futils.scm;h=ed09712d9a990531d9e9daecdc81e1131596aed1;hb=bdc03bcc2da4d01745fb542d7a7d642b888b691e;hp=28cc16346524e78c189e7ef194906a37e6c9dad0;hpb=d87136a9ca74b0b145800e362144eeefff803eba;p=gacela.git diff --git a/src/utils.scm b/src/utils.scm index 28cc163..ed09712 100644 --- a/src/utils.scm +++ b/src/utils.scm @@ -18,7 +18,10 @@ (define-module (gacela utils) #:export (use-cache-with arguments-calling - arguments-apply)) + arguments-apply + bound? + names-arguments + make-producer)) ;;; Cache for procedures @@ -44,7 +47,10 @@ (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))))) @@ -139,3 +145,33 @@ (optional-arguments-apply args values) (keyword-arguments-apply args values) (rest-arguments-apply args values)))) + +(define (names-arguments args) + (map (lambda (x) (if (list? x) (car x) x)) + (filter (lambda (x) (not (keyword? x))) + (pair-to-list args)))) + + +;;; 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)))) + + +;;; Miscellaneous + +(define (pair-to-list pair) + (cond ((null? pair) '()) + ((not (pair? pair)) (list pair)) + (else (cons (car pair) (pair-to-list (cdr pair))))))