blob: 216104c10b55d8372b6f091790761e25094978d7 (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#!/usr/bin/env guile
# -*- scheme -*-
!#
(use-modules (ice-9 match)
(fibers)
(fibers channels))
(define (sieve p in)
(let ((out (make-channel)))
(spawn-fiber (lambda ()
(let lp ()
(let ((n (get-message in)))
(unless (zero? (modulo n p))
(put-message out n)))
(lp)))
#:parallel? #t)
out))
(define (integers-from n)
(let ((out (make-channel)))
(spawn-fiber (lambda ()
(let lp ((n n))
(put-message out n)
(lp (1+ n))))
#:parallel? #t)
out))
(define (take ch n)
(let lp ((n n))
(unless (zero? n)
(get-message ch)
(lp (1- n)))))
(define (primes)
(let ((out (make-channel)))
(spawn-fiber (lambda ()
(let lp ((ch (integers-from 2)))
(let ((p (pk (get-message ch))))
(put-message out p)
(lp (sieve p ch)))))
#:parallel? #t)
out))
(define (main args)
(match args
((_ count)
(let ((count (string->number count)))
(run-fibers (lambda () (take (primes) count)))))))
(when (batch-mode?) (main (program-arguments)))
|