add some convenience to the enumerators and change call-with-values

into define-values
This commit is contained in:
Robby Findler 2014-03-20 22:16:48 -05:00
parent 23fa168309
commit c11de94f2a

View File

@ -20,6 +20,7 @@
empty/e empty/e
const/e const/e
from-list/e from-list/e
fin/e
disj-sum/e disj-sum/e
disj-append/e disj-append/e
cons/e cons/e
@ -199,6 +200,8 @@
(λ (x) (λ (x)
(hash-ref rev-map x))))) (hash-ref rev-map x)))))
(define (fin/e . args) (from-list/e (remove-duplicates args)))
(define nats/e (define nats/e
(enum +inf.0 (enum +inf.0
identity identity
@ -554,12 +557,9 @@
[(not (infinite? (size e))) [(not (infinite? (size e)))
(enum +inf.0 (enum +inf.0
(λ (n) (λ (n)
(call-with-values (define-values (q r) (quotient/remainder n (size e)))
(λ () (cons (decode e r)
(quotient/remainder n (size e))) (decode (f (decode e r)) q)))
(λ (q r)
(cons (decode e r)
(decode (f (decode e r)) q)))))
(λ (ab) (λ (ab)
(+ (* (size e) (encode (f (car ab)) (cdr ab))) (+ (* (size e) (encode (f (car ab)) (cdr ab)))
(encode e (car ab)))))] (encode e (car ab)))))]
@ -679,12 +679,9 @@
[(not (infinite? (size e))) [(not (infinite? (size e)))
(enum +inf.0 (enum +inf.0
(λ (n) (λ (n)
(call-with-values (define-values (q r) (quotient/remainder n (size e)))
(λ () (cons (decode e r)
(quotient/remainder n (size e))) (decode (f (decode e r)) q)))
(λ (q r)
(cons (decode e r)
(decode (f (decode e r)) q)))))
(λ (ab) (λ (ab)
(+ (* (size e) (encode (f (car ab)) (cdr ab))) (+ (* (size e) (encode (f (car ab)) (cdr ab)))
(encode e (car ab)))))] (encode e (car ab)))))]
@ -769,14 +766,17 @@
(λ (x) (λ (x)
(encode (force promise/e) x)))) (encode (force promise/e) x))))
;; fix/e : size (enum a -> enum a) -> enum a ;; fix/e : [size] (enum a -> enum a) -> enum a
(define (fix/e size f/e) (define fix/e
(define self (delay (f/e (fix/e size f/e)))) (case-lambda
(enum size [(f/e) (fix/e +inf.0 f/e)]
(λ (n) [(size f/e)
(decode (force self) n)) (define self (delay (f/e (fix/e size f/e))))
(λ (x) (enum size
(encode (force self) x)))) (λ (n)
(decode (force self) n))
(λ (x)
(encode (force self) x)))]))
;; many/e : enum a -> enum (listof a) ;; many/e : enum a -> enum (listof a)
;; or : enum a, #:length natural -> enum (listof a) ;; or : enum a, #:length natural -> enum (listof a)