1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
\r
2 ;;;; *************************************************************************
\r
3 ;;;; FILE IDENTIFICATION
\r
5 ;;;; Name: pipes-examples.lisp
\r
6 ;;;; Purpose: Pipe examples
\r
7 ;;;; Programmer: Kevin M. Rosenberg
\r
8 ;;;; Date Started: Apr 2000
\r
10 ;;;; $Id: pipes-example.lisp,v 1.3 2003/03/15 00:48:56 kevin Exp $
\r
12 ;;;; This file, part of pipes, is Copyright (c) 2002 by Kevin M. Rosenberg
\r
14 ;;;; *************************************************************************
\r
16 (in-package #:pipes-user)
\r
19 (defun integers (&optional (start 0) end)
\r
20 (if (or (null end) (<= start end))
\r
21 (make-pipe start (integers (+ start 1) end))
\r
25 (make-pipe a (fibgen b (+ a b))))
\r
31 (defun divisible? (x y)
\r
35 (pipe-filter #'(lambda (x) (not (divisible? x 7))) (integers)))
\r
38 (defun sieve (stream)
\r
43 (not (divisible? x (pipe-head stream))))
\r
44 (pipe-tail stream)))))
\r
47 (sieve (integers 2)))
\r
52 (defun scale-pipe (factor pipe)
\r
53 (pipe-map #'(lambda (x) (* x factor)) pipe))
\r
55 (defun sum-pipe (sum s)
\r
57 (sum-pipe (+ sum (pipe-head s))
\r
60 (defun partial-sums (s)
\r
61 (make-pipe (pipe-head s) (sum-pipe 0 s)))
\r
63 (defun pi-summands (n)
\r
64 (make-pipe (/ 1d0 n)
\r
65 (pipe-map #'- (pi-summands (+ n 2)))))
\r
68 (scale-pipe 4d0 (partial-sums (pi-summands 1))))
\r
73 (defun euler-transform (s)
\r
74 (let ((s0 (pipe-elt s 0))
\r
75 (s1 (pipe-elt s 1))
\r
76 (s2 (pipe-elt s 2)))
\r
78 (if (eql s1 s2) ;;; series has converged
\r
80 (make-pipe (- s2 (/ (square (- s2 s1))
\r
81 (+ s0 (* -2 s1) s2)))
\r
82 (euler-transform (pipe-tail s))))
\r
86 (defun ln2-summands (n)
\r
87 (make-pipe (/ 1d0 n)
\r
88 (pipe-map #'- (ln2-summands (1+ n)))))
\r
90 (defun ln2-stream ()
\r
91 (partial-sums (ln2-summands 1)))
\r
93 (defun make-tableau (transform s)
\r
95 (make-tableau transform
\r
96 (funcall transform s))))
\r
98 (defun accelerated-sequence (transform s)
\r
99 (pipe-map #'pipe-head
\r
100 (make-tableau transform s)))
\r
103 (defun run-examples ()
\r
104 (let ((*print-length* 20))
\r
105 (format t "~&pi-stream:~& ~S"
\r
106 (pipe-values (pi-stream) 10))
\r
107 (format t "~& pi-stream euler-transform:~& ~S"
\r
108 (pipe-values (euler-transform (pi-stream)) 10))
\r
109 (format t "~& pi-stream accelerate-sequence:~& ~S"
\r
111 (accelerated-sequence #'euler-transform (pi-stream)) 10)))
\r
112 (format t "~&ln2-stream:~& ~S"
\r
113 (pipe-values (ln2-stream) 10))
\r
114 (format t "~& ln2-stream euler-transform:~& ~S"
\r
115 (pipe-values (euler-transform (ln2-stream)) 10))
\r
116 (format t "~& ln2-stream accelerate-sequence:~& ~S"
\r
118 (accelerated-sequence #'euler-transform (ln2-stream)) 10)))
\r