r4200: *** empty log message ***
[pipes.git] / pipes-example.lisp
index 2cf07f6a9f5bda662e1a0ec58ab79c002f325a53..3ce8cc09078e8b4cfd63083e19cd30540db7394f 100644 (file)
-;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
-;;;; *************************************************************************
-;;;; FILE IDENTIFICATION
-;;;;
-;;;; Name:          pipes-examples.lisp
-;;;; Purpose:       Pipe examples
-;;;; Programmer:    Kevin M. Rosenberg
-;;;; Date Started:  Apr 2000
-;;;;
-;;;; $Id: pipes-example.lisp,v 1.2 2002/11/07 20:26:13 kevin Exp $
-;;;;
-;;;; This file, part of pipes, is Copyright (c) 2002 by Kevin M. Rosenberg
-;;;;
-;;;; *************************************************************************
-
-(in-package #:pipes-user)
-
-
-(defun integers (&optional (start 0) end)
-  (if (or (null end) (<= start end))
-      (make-pipe start (integers (+ start 1) end))
-    nil))
-
-(defun fibgen (a b)
-  (make-pipe a (fibgen b (+ a b))))
-
-(defun fibs ()
-  (fibgen 0 1))
-
-
-(defun divisible? (x y) 
-  (zerop (rem x y)))
-
-(defun no-sevens ()
-  (pipe-filter #'(lambda (x) (not (divisible? x 7))) (integers)))
-
-
-(defun sieve (stream)
-  (make-pipe
-   (pipe-head stream)
-   (sieve (pipe-filter
-           #'(lambda (x)
-              (not (divisible? x (pipe-head stream))))
-           (pipe-tail stream)))))
-
-(defun primes ()
-  (sieve (integers 2)))
-
-
-;; Pi
-
-(defun scale-pipe (factor pipe)
-  (pipe-map #'(lambda (x) (* x factor)) pipe))
-
-(defun sum-pipe (sum s)
-  (make-pipe sum
-            (sum-pipe (+ sum (pipe-head s))
-                      (pipe-tail s))))
-
-(defun partial-sums (s)
-  (make-pipe (pipe-head s) (sum-pipe 0 s)))
-
-(defun pi-summands (n)
-  (make-pipe (/ 1d0 n)
-            (pipe-map #'- (pi-summands (+ n 2)))))
-
-(defun pi-stream ()
-  (scale-pipe 4d0 (partial-sums (pi-summands 1))))
-
-(defun square (x)
-  (* x x))
-
-(defun euler-transform (s)
-  (let ((s0 (pipe-elt s 0))
-       (s1 (pipe-elt s 1))    
-       (s2 (pipe-elt s 2)))
-    (if (and s0 s1 s2)
-       (if (eql s1 s2) ;;; series has converged 
-               +empty-pipe+
-         (make-pipe (- s2 (/ (square (- s2 s1))
-                             (+ s0 (* -2 s1) s2)))
-                    (euler-transform (pipe-tail s))))
-         +empty-pipe+)))
-
-
-(defun ln2-summands (n)
-  (pipe-map (/ 1d0 n)
-           (pipe-map #'- (ln2-summands (1+ n)))))
-
-(defun ln2-stream ()
-  (partial-sums (ln2-summands 1)))
-
-(defun make-tableau (transform s)
-  (make-pipe s
-            (make-tableau transform
-                          (funcall transform s))))
-
-(defun accelerated-sequence (transform s)
-  (pipe-map #'pipe-head
-           (make-tableau transform s)))
-
-
-(defun run-examples ()
-  (let ((*print-length* 20))
-    (format t "~&pi-stream: ~S"
-           (pipe-values (pi-stream) 10))
-    (format t "~&euler-transform: ~S"
-           (pipe-values (euler-transform (pi-stream)) 10))
-    (format t "~&accelerate-sequence: ~S"
-           (pipe-values
-            (accelerated-sequence #'euler-transform (pi-stream)) 10))))
+;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-\r
+;;;; *************************************************************************\r
+;;;; FILE IDENTIFICATION\r
+;;;;\r
+;;;; Name:          pipes-examples.lisp\r
+;;;; Purpose:       Pipe examples\r
+;;;; Programmer:    Kevin M. Rosenberg\r
+;;;; Date Started:  Apr 2000\r
+;;;;\r
+;;;; $Id: pipes-example.lisp,v 1.3 2003/03/15 00:48:56 kevin Exp $\r
+;;;;\r
+;;;; This file, part of pipes, is Copyright (c) 2002 by Kevin M. Rosenberg\r
+;;;;\r
+;;;; *************************************************************************\r
+\r
+(in-package #:pipes-user)\r
+\r
+\r
+(defun integers (&optional (start 0) end)\r
+  (if (or (null end) (<= start end))\r
+      (make-pipe start (integers (+ start 1) end))\r
+    nil))\r
+\r
+(defun fibgen (a b)\r
+  (make-pipe a (fibgen b (+ a b))))\r
+\r
+(defun fibs ()\r
+  (fibgen 0 1))\r
+\r
+\r
+(defun divisible? (x y) \r
+  (zerop (rem x y)))\r
+\r
+(defun no-sevens ()\r
+  (pipe-filter #'(lambda (x) (not (divisible? x 7))) (integers)))\r
+\r
+\r
+(defun sieve (stream)\r
+  (make-pipe\r
+   (pipe-head stream)\r
+   (sieve (pipe-filter\r
+           #'(lambda (x)\r
+              (not (divisible? x (pipe-head stream))))\r
+           (pipe-tail stream)))))\r
+\r
+(defun primes ()\r
+  (sieve (integers 2)))\r
+\r
+\r
+;; Pi\r
+\r
+(defun scale-pipe (factor pipe)\r
+  (pipe-map #'(lambda (x) (* x factor)) pipe))\r
+\r
+(defun sum-pipe (sum s)\r
+  (make-pipe sum\r
+            (sum-pipe (+ sum (pipe-head s))\r
+                      (pipe-tail s))))\r
+\r
+(defun partial-sums (s)\r
+  (make-pipe (pipe-head s) (sum-pipe 0 s)))\r
+\r
+(defun pi-summands (n)\r
+  (make-pipe (/ 1d0 n)\r
+            (pipe-map #'- (pi-summands (+ n 2)))))\r
+\r
+(defun pi-stream ()\r
+  (scale-pipe 4d0 (partial-sums (pi-summands 1))))\r
+\r
+(defun square (x)\r
+  (* x x))\r
+\r
+(defun euler-transform (s)\r
+  (let ((s0 (pipe-elt s 0))\r
+       (s1 (pipe-elt s 1))    \r
+       (s2 (pipe-elt s 2)))\r
+    (if (and s0 s1 s2)\r
+       (if (eql s1 s2) ;;; series has converged \r
+               +empty-pipe+\r
+         (make-pipe (- s2 (/ (square (- s2 s1))\r
+                             (+ s0 (* -2 s1) s2)))\r
+                    (euler-transform (pipe-tail s))))\r
+         +empty-pipe+)))\r
+\r
+\r
+(defun ln2-summands (n)\r
+  (make-pipe (/ 1d0 n)\r
+            (pipe-map #'- (ln2-summands (1+ n)))))\r
+\r
+(defun ln2-stream ()\r
+  (partial-sums (ln2-summands 1)))\r
+\r
+(defun make-tableau (transform s)\r
+  (make-pipe s\r
+            (make-tableau transform\r
+                          (funcall transform s))))\r
+\r
+(defun accelerated-sequence (transform s)\r
+  (pipe-map #'pipe-head\r
+           (make-tableau transform s)))\r
+\r
+\r
+(defun run-examples ()\r
+  (let ((*print-length* 20))\r
+    (format t "~&pi-stream:~&  ~S"\r
+           (pipe-values (pi-stream) 10))\r
+    (format t "~& pi-stream euler-transform:~&  ~S"\r
+           (pipe-values (euler-transform (pi-stream)) 10))\r
+    (format t "~& pi-stream accelerate-sequence:~&  ~S"\r
+           (pipe-values\r
+            (accelerated-sequence #'euler-transform (pi-stream)) 10)))\r
+      (format t "~&ln2-stream:~&  ~S"\r
+           (pipe-values (ln2-stream) 10))\r
+    (format t "~& ln2-stream euler-transform:~&  ~S"\r
+           (pipe-values (euler-transform (ln2-stream)) 10))\r
+    (format t "~& ln2-stream accelerate-sequence:~&  ~S"\r
+           (pipe-values\r
+            (accelerated-sequence #'euler-transform (ln2-stream)) 10)))\r
+\r