From c11de94f2ae078e844fc1fb1d2afadecd05414de Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Thu, 20 Mar 2014 22:16:48 -0500 Subject: [PATCH] add some convenience to the enumerators and change call-with-values into define-values --- .../redex-lib/redex/private/enumerator.rkt | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/pkgs/redex-pkgs/redex-lib/redex/private/enumerator.rkt b/pkgs/redex-pkgs/redex-lib/redex/private/enumerator.rkt index e09c24bf2b..f930ff6137 100644 --- a/pkgs/redex-pkgs/redex-lib/redex/private/enumerator.rkt +++ b/pkgs/redex-pkgs/redex-lib/redex/private/enumerator.rkt @@ -20,6 +20,7 @@ empty/e const/e from-list/e + fin/e disj-sum/e disj-append/e cons/e @@ -199,6 +200,8 @@ (λ (x) (hash-ref rev-map x))))) +(define (fin/e . args) (from-list/e (remove-duplicates args))) + (define nats/e (enum +inf.0 identity @@ -554,12 +557,9 @@ [(not (infinite? (size e))) (enum +inf.0 (λ (n) - (call-with-values - (λ () - (quotient/remainder n (size e))) - (λ (q r) - (cons (decode e r) - (decode (f (decode e r)) q))))) + (define-values (q r) (quotient/remainder n (size e))) + (cons (decode e r) + (decode (f (decode e r)) q))) (λ (ab) (+ (* (size e) (encode (f (car ab)) (cdr ab))) (encode e (car ab)))))] @@ -679,12 +679,9 @@ [(not (infinite? (size e))) (enum +inf.0 (λ (n) - (call-with-values - (λ () - (quotient/remainder n (size e))) - (λ (q r) - (cons (decode e r) - (decode (f (decode e r)) q))))) + (define-values (q r) (quotient/remainder n (size e))) + (cons (decode e r) + (decode (f (decode e r)) q))) (λ (ab) (+ (* (size e) (encode (f (car ab)) (cdr ab))) (encode e (car ab)))))] @@ -769,14 +766,17 @@ (λ (x) (encode (force promise/e) x)))) -;; fix/e : size (enum a -> enum a) -> enum a -(define (fix/e size f/e) - (define self (delay (f/e (fix/e size f/e)))) - (enum size - (λ (n) - (decode (force self) n)) - (λ (x) - (encode (force self) x)))) +;; fix/e : [size] (enum a -> enum a) -> enum a +(define fix/e + (case-lambda + [(f/e) (fix/e +inf.0 f/e)] + [(size f/e) + (define self (delay (f/e (fix/e size f/e)))) + (enum size + (λ (n) + (decode (force self) n)) + (λ (x) + (encode (force self) x)))])) ;; many/e : enum a -> enum (listof a) ;; or : enum a, #:length natural -> enum (listof a)