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 |
;; this is a function that returns a powers generator, not a generator |
||
(define (powers |
(define (powers m) |
||
⚫ | |||
(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 ( |
(define (filtered g1 g2) |
||
(generator () |
|||
(define g1 (sequence->generator s1)) |
|||
(define g2 (sequence->generator s2)) |
|||
⚫ | |||
(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))])))) |
||
( |
(for/list ([x (in-producer (filtered squares cubes) (lambda (_) #f))] |
||
⚫ | |||
(for/list ([x (sequence-tail filtered 20)] |
|||
⚫ | |||
x) |
x) |
||
</lang> |
</lang> |