12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #!/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 (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)))
|