Generator/Exponential: Difference between revisions

Content added Content deleted
Line 1,415: Line 1,415:


=={{header|Racket}}==
=={{header|Racket}}==

Racket has (potentially infinite) sequences, which handle most use cases of generators. First-class generators are also available in a library.


<lang racket>
<lang racket>
#lang racket
#lang racket

(require racket/generator)
(require racket/generator)


;; a generator using Racket's sequences
;; this is a function that returns a powers generator, not a generator
(define (powers n)
(define (powers m)
(generator ()
(sequence-map (λ (x) (expt x n)) (in-naturals)))
(for ([n (in-naturals)]) (yield (expt n m)))))


(define squares (powers 2))
(define squares (powers 2))
(define cubes (powers 3))
(define cubes (powers 3))


;; same here
;; using explicit generators
(define (filter s1 s2)
(define (filtered g1 g2)
(generator ()
(define g1 (sequence->generator s1))
(define g2 (sequence->generator s2))
(in-generator
(let loop ([n1 (g1)] [n2 (g2)])
(let loop ([n1 (g1)] [n2 (g2)])
(cond [(< n1 n2) (yield n1) (loop (g1) n2)]
(cond [(< n1 n2) (yield n1) (loop (g1) n2)]
Line 1,439: Line 1,437:
[else (loop (g1) (g2))]))))
[else (loop (g1) (g2))]))))


(define filtered (filter squares cubes))
(for/list ([x (in-producer (filtered squares cubes) (lambda (_) #f))]
[i 30] #:when (>= i 20))

(for/list ([x (sequence-tail filtered 20)]
[_ 10])
x)
x)
</lang>
</lang>